如何使用参数/修改std :: foreach

Jes*_*der 20 c++ loops enumeration stl

我发现自己在写作

for(int i=0;i<myvec.size();i++)
   myvec[i]->DoWhatever(param);
Run Code Online (Sandbox Code Playgroud)

很多,我想把它压缩成一个foreach声明,但我不知道如何进入param那里而不会超级冗长.我也有类似的东西

for(int i=0;i<myvec.size();i++)
   if(myvec[i]->IsOK())
      myvec[i]->DoWhatever(param);
Run Code Online (Sandbox Code Playgroud)

我也想改写那个人.有什么想法吗?

哦,还有,由于各种原因,我不想使用提升.

Mar*_*ork 15

#include <vector>
#include <algorithm>
#include <functional>

class X
{
    public:
        void doWhat(int x) {}
        bool IsOK() const {return true;}
};
class CallWhatIfOk
{
    public:
        CallWhatIfOk(int p): param(p) {}

        void operator()(X& x) const
        {   if (x.IsOK())    {x.doWhat(param);}}
    private:
        int param;
};

int main()
{
    std::vector<X>      myVec;

    std::for_each(  myVec.begin(),
                    myVec.end(),
                    std::bind2nd(std::mem_fun_ref(&X::doWhat),4)
                 );


    std::for_each(  myVec.begin(),
                    myVec.end(),
                    CallWhatIfOk(4)
                 );
}
Run Code Online (Sandbox Code Playgroud)


Kon*_*lph 6

哦,还有,由于各种原因,我不想使用提升.

有效的决定,但很可能是错误的决定.将Boost视为STL的扩展.C++是一种库驱动的语言.如果你不考虑这一点,你的代码将质量低劣.

虽然std::for_each可以在这里使用,但是在C++ 0x之前缺少C++中的lambda表达式使得这很乏味.我主张使用Boost.ForEach!它使这容易:

foreach (yourtype x, yourvec)
    if (x.IsOK())
        x.Whatever();
Run Code Online (Sandbox Code Playgroud)

  • 可能想说你*不能*然后使用提升.说你不想*只是要求争论......;) (8认同)