将std::async与模板函数结合使用
using std::async with template functions
如何将模板函数传递给async?
这是代码:
//main.cpp
#include <future>
#include <vector>
#include <iostream>
#include <numeric>
int
main
()
{
std::vector<double> v(16,1);
auto r0 = std::async(std::launch::async,std::accumulate,v.begin(),v.end(),double(0.0));
std::cout << r0.get() << std::endl;
return 0;
}
以下是错误消息:
^a.cpp:13:88:注:候选人为:在a.cp:1:0:/usr/include/c++/4.8/export:1523:5:注意:模板std::future::type>std::async(std::launch,_Fn&&,_Args&&…)async(启动__policy、_Fn&&__Fn、_Args&&…__Args)^/usr/include/c++/4.8/foreth:1523:5:注意:模板参数推导/替换失败:a.cpp:13:88:注意:无法推导模板参数'_Fn'auto r0=std::async(std::launch::async,std::accumulate,v.begin(),v.end(),double(0.0));^在a.cp:1:0:/usr/include/c++/4.8/export:1543:5:注意:模板std::future::type>std::async(_Fn&&,_Args&&…)异步(_Fn&&__Fn,_Args&&…__Args)^/usr/include/c++/4.8/foreth:1543:5:注意:模板参数推导/替换失败:/usr/include/c++/4.8/export:替换"template std::future::type>std::async(_Fn&&,_Args&&…)[with_Fn=std::launch;_Args={}]":a.cpp:13:88:此处必填/usr/include/c++/4.8/foreth:1543:5:错误:"class std::result_of"中没有名为"type"的类型
问题是,要将第二个参数传递给std::async
,编译器必须将表达式&std::accumulate
转换为函数指针,但它不知道您想要函数模板的哪种特殊化。对于人类来说,很明显你想要一个可以用async
的剩余参数调用的,但编译器不知道这一点,必须分别评估每个参数。
作为PiotrS答案是,您可以通过显式模板参数列表或使用强制转换来告诉编译器您想要哪个std::accumulate
,或者您也可以只使用lambda表达式:
std::async(std::launch::async,[&] { return std::accumulate(v.begin(), v.end(), 0.0); });
在lambda的主体中,编译器为对std::accumulate
的调用执行重载解析,从而确定要使用哪个std::accumulate
。
您必须通过显式传递模板参数或使用static_cast
来消除可能的实例化之间的歧义,因此:
auto r0 = std::async(std::launch::async
, &std::accumulate<decltype(v.begin()), double>
, v.begin()
, v.end()
, 0.0);
或:
auto r0 = std::async(std::launch::async
, static_cast<double(*)(decltype(v.begin()), decltype(v.end()), double)>(&std::accumulate)
, v.begin()
, v.end()
, 0.0);
相关文章:
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- C++ 将函数指针与最佳性能相结合
- 函数与返回类型 node* 与 C++ 中的 OOP 结合使用
- 将复制构造函数与 std::make_shared 结合使用
- 与构造函数中rvalue结合的非const lvalue有关的错误
- 所有版本的 GCC 都与默认成员初始值设定项作斗争,该初始值设定项捕获了这一点,并结合了继承的构造函数
- 将虚拟函数与最终关键字结合使用
- 如何将多个std ::函数结合到一个
- 将继承与静态函数结合使用
- 将指向成员的指针函数与 std::shared_ptr 结合使用
- 如何将 etrace 与动态库结合使用,以按时间顺序跟踪 C++ 中的函数调用
- 而循环构造与 getline 函数相结合,一直持续到 EOF
- 结合 std::wstring 和函数
- 结合函数、绑定、c++ 和托管代码
- C++11的结合函数可以用于std(甚至更好的mtl)载体吗?
- C++:如何结合指针为向量编写析构函数
- 将std::async与模板函数结合使用
- 重载比较运算符的使用>C++与 getter 函数结合使用
- 1-d结合2-d阵列.需要调用main中的函数
- 是否有可能将统一初始化和构造函数结合起来?