c ++遍历列表来调用某个函数

时间:2014-07-21 07:26:56

标签: c++ list function oop pointers

E.g。一个单元有三个功能:

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

现在,如果我希望每个人都是SitDown,我会复制上面的代码并将StandUp()更改为SitDown()。对于我编写的每个新函数,如果我希望每个人都这样做,我必须在我的代码中有另一个for循环体。

是否可以将这个for-loop主体放在另一个函数中,只要我想从UnitList中的所有成员调用某个函数,我就可以重用它?

我觉得这必须在其他地方有答案,我尝试使用谷歌搜索,但我不知道应该寻找哪些关键字。谢谢你的回答!

3 个答案:

答案 0 :(得分: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 :(得分:1)

它可以通过一个辅助函数来解决,该函数执行实际的循环并将成员函数作为参数调用。

这样的事情:

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

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

答案 2 :(得分:0)