可变的模板模板和完美的转发

这个关于对象生成器模式的问题让我想到了使它自动化的方法。

本质上,我想自动创build像std::make_pairstd::bind1ststd::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_sharedmake_shared的一点是,使用它可以节省运行时间。 但是如果我尝试使用make<std::shared_ptr>会怎么样? 不要以为这样就行不通了。 或者,只有一些构造函数参数是模板参数的types,其余的不是? 例如, make<std::vector, int>(other_vector.begin(), other_vector.end()); – 迭代器的types不参与,但是无论如何你都要传递它们。

编写一个通用的make函数是不可能的。

至于标准,那么从那以后它很容易被删除。 你必须检查FDIS。