MaestroMaus
MaestroMaus

Reputation: 375

How can I pass this std::function to std::async

I am working on a piece of multi threaded code but I can't seem to pass a std::function object to the std::async function. I'm sure I am doing something wrong but I can't figure out what that would be. Therefore, I prepared this piece of code so maybe someone who knows could help me.

Test1 demonstrates that this std::function object works.
Test2 contains the thing I want it to do; only I wrapped the function object into a lambda.
Test3 contains the example I can't figure out.

std::function<void(AsyncFunctionExample&)> current_function;

void Test1() {
  current_function = &AsyncFunctionExample::Function1;
  while(current_function != nullptr)
    current_function(*this);
}

void Test2() {
  current_function = &AsyncFunctionExample::Function1;
  while(current_function != nullptr)
    const std::future<void> function_future = std::async([&](){current_function(*this);});
}

void Test3() {
  current_function = &AsyncFunctionExample::Function1;
  while(current_function != nullptr)
    const std::future<void> function_future = std::async(current_function, *this);
}

The full code for this example can be found here. The Stackoverflow editor Warned that I am not allowed to dump a full file of code so that's why I boiled it down to its essentials over here.

The compiler error I receive is:
no matching function for call to 'async(std::function&, AsyncFunctionExample&)' const std::future function_future = std::async(current_function, *this);

This doesn't help me a lot. It basically explains to me that there is no signature that matches my call. But I can't figure out from this error what part of my call is wrong and I don't understand how to change it so it would work.

Upvotes: 0

Views: 666

Answers (1)

Alan Birtles
Alan Birtles

Reputation: 36379

You can't pass a reference through std::async as it needs to copy the value. You can fix this with std::ref:

const std::future<void> function_future = std::async(current_function, std::ref(*this));

Alternatively just change your function to:

std::function<void(AsyncFunctionExample*)> current_function;

Then you can pass this directly:

const std::future<void> function_future = std::async(current_function, this);

Upvotes: 4

Related Questions