2014-07-21 47 views
2

E.g.一類股有三個功能:C++遍歷一個列表來調用某個函數

class Unit{ 
    void StandUp(); 
    void SitDown(); 
    void Die(); 
} 

我有一個指針列表list<Unit*> UnitList;

當我想每個人都站起來:

void EveryoneStandUp(){ 
    for(list<Unit*> it = UnitList.begin(); it != UnitList.eng(); it++){ 
     (*it)->StandUp(); 
    } 
} 

現在,如果我希望大家靜坐,我會複製上面的代碼並將StandUp()更改爲SitDown()。對於我寫的每一個新函數,如果我希望每個人都這樣做,我必須在我的代碼中有另一個for循環體。

是否有可能把這個for循環體放在另一個函數中,當我想從UnitList中的所有成員調用某個函數時,我可以重複使用它?

我覺得這個必須在其他地方有答案,我嘗試了谷歌搜索,但不知道我應該尋找哪些關鍵字。感謝您的回答!

+0

http://www.cplusplus.com/reference/algorithm/for_each/ – Exceptyon

+0

嘗試使用'的std :: for_each'。 – user3553031

+0

和['std :: mem_fn'](http://en.cppreference.com/w/cpp/utility/functional/mem_fn) –

回答

4

你可以這樣做:

void Everyone(void (Unit::*method)()) 
{ 
    for (std::list<Unit*>::iterator it = UnitList.begin(); it != UnitList.end(); it++){ 
     ((*it)->*method)(); 
    } 
} 

,並調用它

Everyone(&Unit::StandUp); 

但在C++ 11,你的例子可以被改寫如:

for (auto* unit : UnitList) { 
    unit->StandUp(); 
} 

這似乎夠清楚了。

1

它可以通過一個輔助函數來解決,該函數執行實際的循環並將成員函數作爲參數進行調用。

事情是這樣的:

void UnitHelperFunction(void (Unit::*func)()) 
{ 
    for (...) 
    { 
     ((*itr)->*func)(); 
    } 
} 

void EveryoneStandUp() 
{ 
    UnitHelperFunction(&Unit::StandUp); 
}