成员函数的std :: async调用

考虑以下课程:

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:错误:必须使用»。«或» - >«在»std :: declval中使用_Tp = void(Foo :: *)调用指向成员函数(long unsigned int),typename std :: add_rvalue_reference <_Tp> :: type = void(Foo :: &&)(long unsigned int)(...)«,例如»(... - > 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, this, 0);
    handle.get();
}

但是,公开方法并不是最好的设计决策。 有没有另一种方法来解决这个问题,而无需更改编译器并将方法保留为私有?


问题似乎是,它不会与成员函数打好关系。 也许你可以先将std::bind成员函数std::bind到你的对象,然后std::async

auto func = std::bind(&Foo::bar, this, std::placeholders::_1);
auto handle = std::async(std::launch::async, func, 0);
链接地址: http://www.djcxy.com/p/29749.html

上一篇: std::async call of member function

下一篇: pair with specified template parameters doesn't compile