4

Sorry for the badly-worded title.

I've been looking through the documentation, but I cannot find anything that might solve this problem I have.

Basically I want to store several function1<void, void*> , with arguments provided, in a vector, and then execute them at a later stage.

This is what I want to accomplish:

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

Now executing task() it wants me to pass an argument, but I passed it in AddSomeTasks? Why is it not using that? Or I have missunderstod the usage of boost::bind?

Thanks

4

2 に答える 2

4

あなたのTaskタイプは引数を必要とします、それはそうであるべきでしたboost::function0<void>。引数をバインドすると、返される(バインドされた)呼び出し可能オブジェクトのアリティは1ではなく0になります。

また、の呼び出しに指定した引数をバインドするため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呼び出しには、2つの異なる概念が混在しています。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));

これにより、1つの引数を取り、voidを返す関数呼び出し演算子を使用して関数オブジェクトが作成されます。次に、呼び出しをtask()inに変更して、ExecuteTask引数を渡します。

于 2012-09-07T20:53:36.707 に答える