我发现自己在写作
for(int i=0;iDoWhatever(param);
很多,我想把它压缩成一个foreach
声明,但我不知道如何进入param
那里而不会超级冗长.我也有类似的东西
for(int i=0;iIsOK()) myvec[i]->DoWhatever(param);
我也想改写那个人.有什么想法吗?
哦,还有,由于各种原因,我不想使用提升.
#include#include #include 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 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) ); }
哦,还有,由于各种原因,我不想使用提升.
有效的决定,但很可能是错误的决定.将Boost视为STL的扩展.C++是一种库驱动的语言.如果你不考虑这一点,你的代码将质量低劣.
虽然std::for_each
可以在这里使用,但是在C++ 0x之前缺少C++中的lambda表达式使得这很乏味.我主张使用Boost.ForEach!它使这更容易:
foreach (yourtype x, yourvec) if (x.IsOK()) x.Whatever();