Home > Net >  A transform question when using std::bind and std::function
A transform question when using std::bind and std::function

Time:11-04

watch the code below

queue<function<void()> > tasks;

void add_job(function<void(void*)> func, void* arg) {
    function<void()> f = bind(func, arg)();
    tasks.push( f );
}

func is the function i want to add to the tasks while it's argument is arg. How can i do to use std::bind to bind its argument so that it can be assigned to the object of function<void()>

CodePudding user response:

How can I do to use std::bind to bind its argument so that it can be assigned to the object of function<void()>?

The std::bind returns an unspecified callable object, which can be stored in the std::function directly. Therefore you required only

function<void()> f = bind(func, arg); // no need to invoke the callable object
tasks.push( f );

However, I would recommend using lambdas (since C 11) instead of std::bind.

Secondly, having global variables are also not a good practice. I would propose the following example code. Let the compiler deduce the type of the passed functions and their (variadic) arguments (function-template).

template<typename Callable, typename... Args>
void add_job(Callable&& func, Args const&... args)
{
    // statically local to the function
    static std::queue<std::function<void()>> tasks;
    // bind the arguments to the func and push to queue
    tasks.push([=] { return func(args...); });
}

void fun1(){}
void fun2(int){}

int main()
{
    add_job(&fun1);
    add_job(&fun2, 1);
    add_job([]{}); // passing lambdas are also possible
}

See a demo in

CodePudding user response:

Just bind it, don't execute it.

function<void()> f = bind(func, arg);
tasks.push( f );
  • Related