考虑以下课程:
class Foo { private: void bar(const size_t); public: void foo(); };
现在Foo :: foo()应该启动执行bar的线程,所以这就是它的实现方式:
void Foo:foo() { auto handle = std::async(std::launch::async,&Foo::bar,this,0); handle.get(); }
这与g -4.6.3完美配合,但不是g -4.5.2,错误信息是
include/c++/4.5.2/functional:180:9: Error: must use ».« or »->« to call pointer-to-member function in »std::declval with _Tp = void (Foo::*)(long unsigned int),typename std::add_rvalue_reference<_Tp>::type = void (Foo::&&)(long unsigned int) (…)«,e.g. »(… -> std::declval with _Tp = void (Foo::*)(long unsigned int),typename std::add_rvalue_reference<_Tp>::type = void (Foo::*&&)(long unsigned int)) (…)«
显然,错误在于旧版本的g.通过将方法公开并引入以下帮助函数,可以解决此问题:
void barHelp(Foo* foo,const size_t n) { foo->bar(n); } void Foo:foo() { auto handle = std::async(std::launch::async,barHelp,0); handle.get(); }
但是,公开方法并不是最好的设计决策.有没有其他方法可以解决此问题而无需更改编译器并将方法保持为私有?
解决方法
问题似乎是它对成员函数不会很好.也许你可以先将成员函数std ::绑定到你的对象,然后再将其传递给std :: async:
auto func = std::bind(&Foo::bar,std::placeholders::_1); auto handle = std::async(std::launch::async,func,0);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。