提升绑定和提升功能,在向量中存储带参数的函数,然后执行它们

时间:2012-09-07 20:29:00

标签: c++ boost boost-bind boost-function

对于措辞严厉的标题感到抱歉。

我一直在查看文档,但我找不到任何可能解决这个问题的方法。

基本上我想在向量中存储带有参数的几个function1<void, void*>,然后在稍后阶段执行它们。

这就是我想要完成的事情:

typedef boost::function1<void, void*> Task;

Vector<Task> mScheduledTasks;
int MyArg = 5;

void SomeTask(void* arg)
{
    // ....
}

void AddSomeTasks()
{
    // nevermind that MyArg is globally accessible
    for (int i = 0; i<5; i++)
        mScheduledTasks.push_back(boost::bind(&SomeTask, _1), (void*)&MyArg);
}

void ExecuteTask()
{
    Task task = mScheduledTasks.front();
    task();
}

现在执行task()它要我传递一个参数,但是我在AddSomeTasks中传递了它?为什么不使用它?或者我错过了使用boost :: bind?

由于

2 个答案:

答案 0 :(得分:4)

您的Task类型需要参数,它应该是boost::function0<void>。绑定参数时,返回的(绑定的)可调用对象是arity 0,而不是1。

此外,要将您提供的参数绑定到boost::bind的调用,_1等用于未绑定的参数,而不是您想要的参数。

像(未经测试)的东西:

typedef boost::function0<void> Task;

Vector<Task> mScheduledTasks;
int MyArg = 5;

void SomeTask(void* arg)
{
    // ....
}

void AddSomeTasks()
{
    // nevermind that MyArg is globally accessible
    for (int i = 0; i<5; i++)
        mScheduledTasks.push_back(boost::bind(&SomeTask, (void*)&MyArg));
}

void ExecuteTask()
{
    Task task = mScheduledTasks.front();
    task();
}

答案 1 :(得分:3)

这取决于你想要传递参数的时间。 push_back调用混合了两种不同的概念。从消息中不清楚是否要在调用MyArgs时传递bind,在这种情况下,您将获得一个不带参数的函数对象并返回void,如果您需要在执行任务时传递MyArgs。对于前者,正如@ForEveR所说,正确的呼叫是

mScheduledTasks.push_back(boost::bind(&SomeTask, (void*)&MyArg));

并且您需要更改Task的typedef,以便它不需要参数。如果您想在调用task对象时传递参数,那么push_back调用将如下所示:

mScheduledTasks.push_back(boost::bind(&SomeTask, _1));

这将创建一个带有函数调用操作符的函数对象,该操作符接受一个参数并返回void。然后,您将task()中的ExecuteTask调用更改为通过您拥有的任何参数。