[英]Why can't compiler deduce types from templates like template<typename R(typename… Args)>?
对我来说,编译器可以推论出这样的模板类型看起来很自然:
template<typename R(typename... Args)>
struct wrap {
std::function<R(Args)> func_;
template<typename... Args2>
wrap(Args2&& ...args2) : func_(std::forward<Args2>(args2)...) {
}
R operator()(Args&&... args) {
cout << "Extra stuff that wrap template does" << endl;
return func_(std::forward<Args>(args)...);
}
}
因此,我可以使用任何函数实例化,而无需将其签名显式赋予模板:
wrap w([](int x){ return 2*x });
并轻松调用它:
w(3);
但是事实证明,这种包装根本不起作用。 GCC 4.8.1 expected nested-name-specifier before 'R'
表示expected nested-name-specifier before 'R'
。
为什么这不可能呢? 实现这种通用包装功能的方式是什么?
有建议在C ++ 1y中做类似的事情,我目前还不了解其状态。
您的语法不适合这些建议,因为lambda是错误的类型,无法实例化std::function
模板。 它需要签名,而不是某些lambda的类型。
编写make_wrap
是可能的,但是需要采用lambda类型并提取args并自己返回值。 这也不是一个好主意,因为如果您知道std::function
类型的唯一方法是从推论中得出,那么在这种情况下为什么要擦除它? 相反,请携带原始的lambda类型。
有这样做的理由,但很少有好处。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.