对于措辞严厉的标题感到抱歉。
我一直在查看文档,但我找不到任何可能解决这个问题的方法。
基本上我想在向量中存储带有参数的几个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?
由于
答案 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
调用更改为通过您拥有的任何参数。