- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
以下代码中的函数 invoke
是调用另一个函数/仿函数/lambda 的简单包装器,这样 invoke(f,args...)
等于 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
但是,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
来自传递给 invoke
的 42
,而不是来自 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&&...
如果你的编译器没有崩溃,就完美前进。
关于c++ - 从仿函数模板参数(特定于 MSVC)推导可变参数和返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26006750/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!