功能invoke
下面的代码是一个简单的包装器,用于调用另一个函数/仿函数/lambda,这样invoke(f,args...)
equals f(args...)
。 (其背后的原因是还具有成员函数的重载,从而允许两种用法的通用语法。)
这个实现在 g++ 中工作:
template <class Fn, class ...Args>
auto invoke(Fn f, Args ...args) -> decltype(f(args...)) {
return f(args...);
}
int y = invoke([](int x){ return x+1; }, 42); // y = 43
Demo http://ideone.com/GR4Joh
然而,MSVC 2012(11 月 CTP)抱怨道:
Error: C2893: Failed to specialize function template 'unknown-type invoke(Fn,Args...)'
With the following template arguments:
'main::<lambda_687537b292ffb7afcfd8f8fc292d6e73>'
'int'
(请注意,int
错误消息中来自42
被传递给invoke
,不是来自 lambda 的参数。我通过传递一些不同的东西来检查这一点invoke
.)
如何修复此问题以与 MSVC 2012(11 月 CTP)一起使用?
我尝试过的事情:
当我将可变参数模板参数更改为单个参数时(但仍然是模板参数,即删除所有...
在上面的代码中),代码编译。但我需要支持任意数量的论点。
如果我用非泛型替换尾随返回类型,它也会编译int
返回类型。但显然我想支持通用返回类型。
-
如果我传递函数指针而不是 lambda,行为不会改变。所以它与 lambda 无关。错误消息示例:
Error: C2893: Failed to specialize function template 'unknown-type invoke(Fn,Args...)'
With the following template arguments:
'int (__cdecl *)(int)'
'double'
尝试使用typename result_of<F(Args...)>::type
。 (我的意思是这种情况:使用类型而不是值)。
这不支持标准下的 SFINAE,但可能在半兼容的 C++11 编译器中工作。
还使用Args&&...
如果你的编译器没有崩溃,则完美转发。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)