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();
}

Теперь, выполняя задачу (), он хочет, чтобы я передал аргумент, но я передал его в AddSomeTasks? Почему он не использует это? Или я неправильно понял использование boost :: bind?

Спасибо

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();
}
4

Другие решения

Это зависит от того, когда вы хотите передать аргумент. 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 чтобы передать любой аргумент у вас есть.

3

По вопросам рекламы [email protected]