可变的模板模板和完美的转发
这个关于对象生成器模式的问题让我想到了使它自动化的方法。
本质上,我想自动创build像std::make_pair
, std::bind1st
和std::mem_fun
这样的函数,以便不必为每个模板类types编写不同的函数,可以编写单个可变模板模板函数即时处理所有案件。 这个函数的用法如下:
make<std::pair>(1, 2); // equivalent to std::make_pair(1, 2) make<std::binder2nd>(&foo, 3); // equivalent to std::bind2nd(&foo, 3);
可以写这个函数吗? 我已经尝试过,但是在GCC 4.5或4.6中不起作用:
template <template <typename...> class TemplateClass, typename... Args> TemplateClass<Args...> make(Args&&... args) { return TemplateClass<Args...>(std::forward<Args>(args)...); }
如果我尝试打电话(例如) make<std::pair>(1, 2)
我只是得到
error: no matching function for call to 'make(int, int)'
我在这里的任何地方都有语法错误吗?
或者这是正确的,海湾合作委员会是错的?
或者,这只是在C ++ 0x从根本上不可能?
[编辑]
build议N2555似乎暗示这是允许的, GCC声称已经在GCC4.4中实现了它 。
这是完全正确的。 我会期待它的工作。 所以我认为海湾合作委员会拒绝这一点是错误的。 FWIW:
#include <utility> template <template <typename...> class TemplateClass, typename... Args> TemplateClass<Args...> make(Args&&... args) { return TemplateClass<Args...>(std::forward<Args>(args)...); } int main() { make<std::pair>(1, 2); } // [js@HOST2 cpp]$ clang++ -std=c++0x main1.cpp // [js@HOST2 cpp]$
这可能是海湾合作委员会的怪癖。 我可以得到以下的开发快照(我现在没有4.6的副本):
template< template<typename...> class TemplateClass , typename... Args , typename Result = TemplateClass<Args...> // Also works with the arguably more correct // , typename Result = TemplateClass< // typename std::decay<Args>::type... // > > Result make(Args&&... args) { /* as before */ }
这是非常错误的,比如说make_shared
。 make_shared
的一点是,使用它可以节省运行时间。 但是如果我尝试使用make<std::shared_ptr>
会怎么样? 不要以为这样就行不通了。 或者,只有一些构造函数参数是模板参数的types,其余的不是? 例如, make<std::vector, int>(other_vector.begin(), other_vector.end());
– 迭代器的types不参与,但是无论如何你都要传递它们。
编写一个通用的make
函数是不可能的。
至于标准,那么从那以后它很容易被删除。 你必须检查FDIS。