val
val

Reputation: 749

Converting future in multithreaded library

I am using a simple multithreaded library to try and understand the basics.

The lib has a queueing function that looks like this:

auto enqueue(F&& f, Args&&... args) 
-> std::future<typename std::result_of<F(Args...)>::type>;

And stores functions like this:

std::queue< std::function<void()> > tasks;

There was an example on how to pass Lambdas, but i'd like to pass member variables. So i created a small object:

Threadpool tp(4);

class myClass{
  vector<std::future<int>> res;
public:
  int compute(int i){
    return 2 * i;
  };
  void update(){
    for(int i = 0; i < 10; i++){
        res.emplace_back(
            // C2664 - 'std::future<int>::future(const std::future<int> &)': 
            // cannot convert argument 1 from 'std::future<_Rx>' to 'std::future<int> &&'
            tp.enqueue(std::bind(&myClass::compute, this), i)
        );
    };
  }
};

Creating an argumentless function works. But even the example lambda on the site works with a passed parameter:

tp.enqueue([](int answer) { return answer; }, 42);

What am I not getting here?

Also a side question: When it comes to standard functions what is the advantage of using:

auto fn(...) -> return type 

instead of:

return type fn(...)

Upvotes: 1

Views: 57

Answers (1)

Jarod42
Jarod42

Reputation: 217135

Placeholders is missing:

tp.enqueue(std::bind(&myClass::compute, this, std::placeholders::_1), i);

or simply

tp.enqueue(std::bind(&myClass::compute, this, i));

or with lambda

tp.enqueue([=]() { this->compute(i); });

Upvotes: 3

Related Questions