4

对不起,措辞不好的标题。

我一直在查看文档,但我找不到任何可以解决我遇到的这个问题的东西。

基本上我想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 的用法?

谢谢

4

2 回答 2

4

你的Task类型需要一个参数,它应该是boost::function0<void>. 绑定参数时,返回的(绑定的)可调用对象的数量为 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();
}
于 2012-09-07T20:44:24.600 回答
3

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

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

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

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

这将创建一个带有函数调用运算符的函数对象,该运算符接受一个参数并返回 void。然后,您将调用更改为task()inExecuteTask以传递您拥有的任何参数。

于 2012-09-07T20:53:36.707 回答