steffen
steffen

Reputation: 8958

How to pass function argument to boost::async()

How do I get boost::async to pass a function argument to the function it executes. My code is

#include <iostream>

// This is for the boos version
#include <boost/thread/future.hpp>
using boost::async;

// This is for the standard library version
//~ #include <future>
//~ using std::async;

int f(int x) {
   std::cout << " in f " << x << std::endl;
   return x+1;
}

int main() {
    auto f_res = async(f,3);
    std::cout << "f " << f_res.get() << std::endl;
    return 0;
}

I compile with

g++ -std=c++14 -lboost_thread -lboost_system -lpthread test_async_boost.cc

, g++ version 5.3.0 and get many errors, complaining about the number of arguments async is willing to take:

test_async_boost_2.cc: In function 'int main()':
test_async_boost_2.cc:16:26: error: no matching function for call to 'async(int (&)(int), int)'
    auto f_res = async(f,3);
                          ^
In file included from test_async_boost_2.cc:3:0:
/usr/include/boost/thread/future.hpp:4035:3: note: candidate: template<class F> boost::unique_future<typename boost::result_of<F()>::type> boost::async(F&&)
   async(BOOST_THREAD_FWD_REF(F) f) {
   ^
/usr/include/boost/thread/future.hpp:4035:3: note:   template argument deduction/substitution failed:
test_async_boost_2.cc:16:26: note:   candidate expects 1 argument, 2 provided
    auto f_res = async(f,3);
                          ^
In file included from test_async_boost_2.cc:3:0:
/usr/include/boost/thread/future.hpp:4018:3: note: candidate: template<class R> boost::unique_future<T> boost::async(R (*)())
   async(R(*f)()) {
   ^
/usr/include/boost/thread/future.hpp:4018:3: note:   template argument deduction/substitution failed:
test_async_boost_2.cc:16:26: note:   candidate expects 0 arguments, 1 provided
    auto f_res = async(f,3);
                          ^
In file included from test_async_boost_2.cc:3:0:
/usr/include/boost/thread/future.hpp:3695:3: note: candidate: template<class F> boost::unique_future<typename boost::result_of<typename boost::decay<T>::type()>::type> boost::async(boost::launch, F&&)
   async(launch policy, BOOST_THREAD_FWD_REF(F) f) {
   ^
/usr/include/boost/thread/future.hpp:3695:3: note:   template argument deduction/substitution failed:
test_async_boost_2.cc:16:26: note:   cannot convert 'f' (type 'int(int)') to type 'boost::launch'
    auto f_res = async(f,3);
                          ^
In file included from test_async_boost_2.cc:3:0:
/usr/include/boost/thread/future.hpp:3634:3: note: candidate: template<class R> boost::unique_future<T> boost::async(boost::launch, R (*)())
   async(launch policy, R(*f)()) {
   ^
/usr/include/boost/thread/future.hpp:3634:3: note:   template argument deduction/substitution failed:
test_async_boost_2.cc:16:26: note:   cannot convert 'f' (type 'int(int)') to type 'boost::launch'
    auto f_res = async(f,3);
                          ^

If I switch the commenting in the #include directuves and the using lines, and compile with

g++ -std=c++14 test_async_boost_2.cc -lpthread

I get the desired output:

in f 3
f 4

How do I get boost::async to work with function arguments?

And: Where do I find the reference documentation of boos::async?

Upvotes: 1

Views: 877

Answers (1)

Zereges
Zereges

Reputation: 5209

In order to pass a function with its arguments to the method accepting a function, you have to use std::bind or boost::bind.

Upvotes: 1

Related Questions