std::async 有一个成员函数,持有另一个成员函数作为参数

std::async with a member function, holding another meber fucntion as an argument

我有以下 class:

class Test
{
public:   
   void Func1(std::string const& a, std::string const& b, std::function<void(std::vector<double> const&, int)> func);   
   std::vector<double> Func2(std::vector<double> const& v, size_t const i);
};

为了异步调用函数 Func1,我做了:

Test te;
auto fa = std::bind(&Test::Func2, &te, _1, _2);
auto fb = std::bind(&Test::Func1, &te, a, b, fa);
    
auto fab = std::async(std::launch::async, fb);

'fa' 和 'fb' 编译但异步调用 'fab' 不编译。我应该如何调用 Func1 的 std::async?

fafb 在您实际调用它们之前不会完全“编译” - 函数调用运算符似乎直到那时才被实例化。调用后,您会发现 fb 无效,即 fb() 无法编译。一旦你解决了这个问题,async 调用就会起作用 :)

作为进一步的提示,请注意 std::bind 被巧妙地破坏了,不推荐用于新代码。你最好使用 lambda 表达式(它们实际上可以在这里工作!)。

bind是怎么破解的?像这样:

std::bind(&Test::Func1, &te, a, b, fa)(); // won't compile

但是:

using FnArg = std::function<void(std::vector<double> const&, int)>;
fb = std::bind(&Test::Func1, &te, a, b, FnArg(fa));
fb(); // compiles OK

所以,最好忘记 std::bind 的存在,并使用 lambdas:

#include <functional>
#include <future>
#include <string>
#include <vector>

class Test
{
public:
    using FnArg = std::function<void(std::vector<double> const&, int)>;
    void Func1(std::string const&, std::string const&, FnArg) {}
    std::vector<double> Func2(std::vector<double> const&, size_t const) {}
};

int main()
{
    Test te;
    std::vector<double> vd;
    std::string a, b;
    auto fa = [&te](const auto &a, auto b){ return te.Func2(a, b); };
    auto fb = [=,&te](){ return te.Func1(a, b, fa); };
    fa(vd, 1);
    fb();
        
    auto fab = std::async(std::launch::async, fb);
    fab.wait();
}

随意乱搞online