Извините за плохо сформулированный заголовок.
Я просматривал документацию, но не могу найти ничего, что могло бы решить эту проблему, которая у меня есть.
В основном я хочу хранить несколько 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();
}
Теперь, выполняя задачу (), он хочет, чтобы я передал аргумент, но я передал его в AddSomeTasks? Почему он не использует это? Или я неправильно понял использование boost :: bind?
Спасибо
ваш 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();
}
Это зависит от того, когда вы хотите передать аргумент. push_back
Call смешивает два разных понятия. Из сообщения не ясно, хотите ли вы пройти MyArgs
во время звонка bind
, в этом случае вы получите функциональный объект, который не принимает аргументов и возвращает void, если вы хотите передать MyArgs
во время выполнения задачи. Для первого, как сказал @ForEveR, правильный вызов
mScheduledTasks.push_back(boost::bind(&SomeTask, (void*)&MyArg));
и вам нужно изменить свой typedef для Task
так что это не требует никаких аргументов. Если вы хотите передать аргумент в точке вызова task
объект, то push_back
вызов будет выглядеть так:
mScheduledTasks.push_back(boost::bind(&SomeTask, _1));
Это создаст объект функции с оператором вызова функции, который принимает один аргумент и возвращает void. Тогда вы измените вызов на task()
в ExecuteTask
чтобы передать любой аргумент у вас есть.