对我而言,编译器可以推断出类似这样的模板类型是很自然的:
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’
。
为什么这不可能?实现这种通用包装功能的方法是什么?
答案 0 :(得分:1)
有人建议在C ++ 1y中做这样的事情,其状态我不是最新的。
您的语法不适合这些提案,因为lambda是用于实例化std::function
模板的错误类型。它想要一个签名,而不是一些lambda的类型。
编写make_wrap
是可能的,但需要采用lambda类型并提取args并自己返回值。这也很少是一个好主意,因为如果你知道std::function
类型的唯一方法来自演绎,那么为什么要键入它呢?相反,携带原始的lambda类型。
有理由想要这样做,但它们很少有好处。