[英]std::merge doesn't work with std::async
我想在一个单独的线程中合并两个向量
int main()
{
vector<int> a(100);
vector<int> b(100);
vector<int> c(200);
std::async(std::launch::async, std::merge, a.begin(), a.end(), b.begin(),
b.end(),
c.begin());
}
这不编译
main.cpp: In function ‘int main()’:
main.cpp:17:25: error: no matching function for call to ‘async(std::launch, <unresolved overloaded function type>, std::vector<int>::iterator, std::vector<int>::iterator, std::vector<int>::iterator, std::vector<int>::iterator, std::vector<int>::iterator)’
c.begin())
^
In file included from main.cpp:4:0:
/usr/include/c++/6.2.1/future:1709:5: note: candidate: template<class _Fn, class ... _Args> std::future<typename std::result_of<typename std::decay<_Tp>::type(typename std::decay<_BoundArgs>::type ...)>::type> std::async(std::launch, _Fn&&, _Args&& ...)
async(launch __policy, _Fn&& __fn, _Args&&... __args)
^~~~~
/usr/include/c++/6.2.1/future:1709:5: note: template argument deduction/substitution failed:
main.cpp:17:25: note: couldn't deduce template parameter ‘_Fn’
c.begin())
^
In file included from main.cpp:4:0:
/usr/include/c++/6.2.1/future:1739:5: note: candidate: template<class _Fn, class ... _Args> std::future<typename std::result_of<typename std::decay<_Tp>::type(typename std::decay<_BoundArgs>::type ...)>::type> std::async(_Fn&&, _Args&& ...)
async(_Fn&& __fn, _Args&&... __args)
^~~~~
/usr/include/c++/6.2.1/future:1739:5: note: template argument deduction/substitution failed:
/usr/include/c++/6.2.1/future: In substitution of ‘template<class _Fn, class ... _Args> std::future<typename std::result_of<typename std::decay<_Tp>::type(typename std::decay<_BoundArgs>::type ...)>::type> std::async(_Fn&&, _Args&& ...) [with _Fn = std::launch; _Args = {}]’:
main.cpp:17:25: required from here
/usr/include/c++/6.2.1/future:1739:5: error: no type named ‘type’ in ‘class std::result_of<std::launch()>’
另一方面,如果我打电话
std::merge(a.begin(), a.end(), b.begin(), b.end(), c.begin());
一切正常。 如果我也使用lambda。
为什么?
std::merge
是一个模板函数 。 获取指向模板函数的指针需要您明确指定模板参数:
std::async(std::launch::async,
&std::merge<decltype(a.begin()), decltype(b.begin()), decltype(c.begin())>,
a.begin(), a.end(), b.begin(),
b.end(),
c.begin());
在这里使用lambda可能是最干净,更易读的解决方案:
auto merger = [&a, &b, &c]
{
return std::merge(a.begin(), a.end(), b.begin(), b.end(), c.begin());
};
std::async(std::launch::async, merger);
在C ++ 14中,您可以使用通用lambda直接在std::async
传递参数。 (这是否比捕获a
, b
和c
更好的解决方案值得怀疑。)示例:
auto merger = [](auto&&... xs)
{
return std::merge(std::forward<decltype(xs)>(xs)...);
};
std::async(std::launch::async, merger,
a.begin(), a.end(), b.begin(), b.end(), c.begin());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.