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)
哦,还有,由于各种原因,我不想使用提升.
有效的决定,但很可能是错误的决定.将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)
| 归档时间: |
|
| 查看次数: |
22009 次 |
| 最近记录: |