std::async 可以与模板函数一起使用吗
Posted
技术标签:
【中文标题】std::async 可以与模板函数一起使用吗【英文标题】:Can std::async be use with template functions 【发布时间】:2012-05-24 02:52:18 【问题描述】:std::async
是否可以使用模板函数?我尝试将 std::reverse
作为异步任务启动,但出现编译时错误。
我尝试使用更简单的函数(foo 和 bar),发现只有非模板函数在工作。
#include <algorithm>
#include <future>
#include <string>
void foo(std::string::iterator first, std::string::iterator last)
template<class BidirectionalIterator>
void bar(BidirectionalIterator first, BidirectionalIterator last)
int main()
std::string str = "Lorem ipsum, dolor sit amet";
auto result_reverse = std::async(std::reverse, str.begin(), str.end()); // Compile-time error
auto result_foo = std::async(foo, str.begin(), str.end());
auto result_bar = std::async(bar, str.begin(), str.end()); // Compile-time error
result_reverse.get();
result_foo.get();
result_bar.get();
编译错误如下:
main.cpp: In function ‘int main()’:
main.cpp:18:71: erreur: no matching function for call to ‘async(<unresolved overloaded function type>, std::basic_string<char>::iterator, std::basic_string<char>::iterator)’
main.cpp:18:71: note: candidates are:
/usr/include/c++/4.6/future:1355:5: note: template<class _Fn, class ... _Args> std::future<typename std::result_of<_Functor(_ArgTypes ...)>::type> std::async(std::launch, _Fn&&, _Args&& ...)
/usr/include/c++/4.6/future:1378:5: note: template<class _Fn, class ... _Args> typename std::__async_sfinae_helper<typename std::decay<_Functor>::type, _Fn, _Args ...>::type std::async(_Fn&&, _Args&& ...)
main.cpp:18:71: erreur: unable to deduce ‘auto’ from ‘<expression error>’
main.cpp:20:62: erreur: no matching function for call to ‘async(<unresolved overloaded function type>, std::basic_string<char>::iterator, std::basic_string<char>::iterator)’
main.cpp:20:62: note: candidates are:
/usr/include/c++/4.6/future:1355:5: note: template<class _Fn, class ... _Args> std::future<typename std::result_of<_Functor(_ArgTypes ...)>::type> std::async(std::launch, _Fn&&, _Args&& ...)
/usr/include/c++/4.6/future:1378:5: note: template<class _Fn, class ... _Args> typename std::__async_sfinae_helper<typename std::decay<_Functor>::type, _Fn, _Args ...>::type std::async(_Fn&&, _Args&& ...)
main.cpp:20:62: erreur: unable to deduce ‘auto’ from ‘<expression error>’
但是,当我手动指定模板实例时它通过了,例如std::async(std::reverse<std::string::iterator>, str.begin(), str.end())
。
这是编译器错误 (GCC 4.6.3) 还是定义明确的行为?
【问题讨论】:
模板不是函数,因此根据标准行为是正确的。如果你想要推导出的参数,你需要将它包装在一个仿函数中。 【参考方案1】:可以,但调用方式有点不同:
auto result_reverse = std::async([&str]()
std::reverse(str.begin(), str.end());
);
这是因为std::reverse()
不是函数,而是作为函数调用时变成函数的函数模板。
上述反转字符串的副本并丢弃结果。要通过引用传递字符串,应将 lambda 表达式更改为以 [&str]()
开头。
【讨论】:
+1,但这基本上什么都不做,你应该通过引用传递str
。
你是对的,它反转一个字符串的副本并丢弃结果。我认为这只是使用函数模板的一个示例。
为什么lambda参数列表和它的body之间有一个mutable关键字?
@authchir lambda 的对象 operator()
默认为 const,这使得变量也被 const 值捕获。 ***.com/q/5501959/412080【参考方案2】:
std::reverse
不是函数而是函数模板,您可以使用该模板的特化(即函数):
auto result_reverse = std::async(&std::reverse<std::string::iterator>, str.begin(), str.end());
【讨论】:
@MatthieuM。不,在这种情况下,函数名称将隐式衰减为指向函数的指针。在处理函数指针时,我仍然更喜欢明确地要求它......荒谬,因为我不这样做是为了数组->指针衰减......以上是关于std::async 可以与模板函数一起使用吗的主要内容,如果未能解决你的问题,请参考以下文章
在 Visual Studio 中,与 std::async 一起使用时未调用“thread_local”变量的析构函数,这是一个错误吗?
为啥 std::async 不能与接收抽象类引用作为参数的函数一起使用?
std::asyncstd::futurestd::packaged_taskstd::promise
我可以将 abp 模板与 NET Core 或 FULL NET Core 与 Angular Js 1.x 一起使用吗?