【发布时间】:2011-09-23 02:33:31
【问题描述】:
object generator pattern 上的This question 让我开始思考如何实现自动化。
本质上,我想自动创建 std::make_pair、std::bind1st 和 std::mem_fun 等函数,这样您就不必为每个模板类类型编写不同的函数,而可以编写一个可变参数模板模板函数一次处理所有案件。这个函数的用法如下:
make<std::pair>(1, 2); // equivalent to std::make_pair(1, 2)
make<std::binder2nd>(&foo, 3); // equivalent to std::bind2nd(&foo, 3);
可以写这个函数make吗?我已经尝试过了,但它在 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)'
我在这里的任何地方都有语法错误吗?
或者这是对的而 GCC 是错的?
或者这在 C++0x 中根本不可能?
[编辑]
提案N2555 似乎表明这是允许的,GCC claims to have implemented it in GCC4.4。
【问题讨论】:
-
我认为有一个问题,可变参数模板模板参数只会匹配可变参数模板类,IIRC。此外,感谢
std::bind,mem_fn和bindNth将被 C++0x 淘汰和弃用。 -
@Xeo:您的意思是 GCC 或标准中的问题? N2555 表明它应该是可能的,并且 GCC 声称已在 4.4 中实现它(请参阅我的编辑)
-
@Peter:提案并没有说它已被 FDIS 采纳(但我当然希望它被采纳)。让我检查一下。 编辑:FDIS有提案中的措辞,所以我不知道问题出在哪里。
-
我想知道模板参数的推导方式是否存在问题?例如,是否 Args 最终成为引用类型,这会导致某些 SFINAE 效果在解析期间丢弃您的 make 函数?
-
@PeterAlexander:正如上面提到的答案,这似乎是当前 gcc 的一个错误。供您参考,通过使用辅助(无意义?)类模板,ideone(gcc-4.5.1) 以某种方式编译了它。
标签: c++ c++11 variadic-templates template-templates