2012-09-07 27 views
4

對不起措辭錯誤的標題。Boost綁定和提升功能,將參數存儲在一個向量中,然後執行它們

我一直在瀏覽文檔,但我找不到任何可能解決此問題的東西。

基本上我想在向量中存儲幾個帶有參數的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過去了嗎?爲什麼不使用它?或者我有missunderstod使用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(); 
} 
+1

是的,那正是我想要的!還有一件事,如果SomeTask是一個成員函數,那麼語法會是什麼樣子呢? – KaiserJohaan

+1

如果它是一個成員函數,你應該先綁定對象:'boost :: bind(&Class :: SomeTask,&object,(void *)&MyArg)'(假設'object'類型爲'Class') – artm

3

這取決於當你想傳遞參數上。 push_back調用混合了兩種不同的概念。從消息中不清楚在調用bind時是否要通過MyArgs,在這種情況下,如果您想在執行時通過MyArgs,則會返回一個不帶參數並返回void的函數對象任務。對於前者,由於@ForEveR說,正確的調用是

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

,您需要更改爲Task的typedef,以便它不帶任何參數。如果你想通過在調用task對象點的說法,那麼push_back調用是這樣的:

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

這將創建一個函數對象與函數調用操作它有一個參數和返回void。然後,您將ExecuteTask中的號碼更改爲task(),以傳遞您擁有的任何參數。

+0

我想通過當我調用綁定時MyArgs,我被_1語法錯誤 – KaiserJohaan

+0

@KaiserJohaan - 很容易讓它們糾結。 –

+0

當我嘗試執行ExecuteTask(),然後運行task()時,它仍然要求我爲task()提供一個參數,即使我想將它傳遞並存儲在AddSomeTasks()中。我將如何解決它? – KaiserJohaan

相關問題