c – 可以使用模板函数std :: async
发布时间:2020-12-16 03:26:21 所属栏目:百科 来源:网络整理
导读:std::async 是否喜欢使用模板功能?我试图将laugh std::reverse 作为一个异步任务bu得到编译时错误. 我试图使用更简单的函数(foo和bar),并发现只有非模板功能正在运行. #include algorithm#include future#include stringvoid foo(std::string::iterator fir
std::async 是否喜欢使用模板功能?我试图将laugh
std::reverse 作为一个异步任务bu得到编译时错误.
我试图使用更简单的函数(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.end()); auto result_bar = std::async(bar,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)’ main.cpp:20:62: note: candidates are: /usr/include/c++/4.6/future:1355:5: note: template<class _Fn,_Args&& ...) main.cpp:20:62: erreur: unable to deduce ‘auto’ from ‘<expression error>’ 但是,当我手动指定模板instanciation,如std :: async(std :: reverse< std :: string :: iterator> str.begin(),str.end())时,它会通过. 这是一个编译器错误(GCC 4.6.3)还是明确的行为? 解决方法
它可以,但调用有点不同:
auto result_reverse = std::async([&str]() mutable { std::reverse(str.begin(),str.end()); }); 这是因为std :: reverse()不是一个函数,而是一个作为函数调用时变成函数的函数模板. 上面的内容反转了一个字符串的副本并抛弃了结果.要通过引用传递字符串,应该将lambda表达式更改为以[& str]()开头. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |