更简单的方法是为矢量(或者STL中的其他东西)做回调吗?C++

y2k*_*y2k 4 c++ stl vector

我正在制作一个简单的犯罪模拟游戏.

在整个过程中,我一遍又一遍地做同样的事情:

// vector<Drug*> drugSack;
for (unsigned int i = 0; i < this->drugSack.size(); i++)
            this->sell(drugSack[i]);
Run Code Online (Sandbox Code Playgroud)

只是一个例子.我讨厌所有这些for循环遍布整个地方omg QQ,无论如何做类似的事情:

drugSack->DoForAll((void*)myCallBack);
Run Code Online (Sandbox Code Playgroud)

我不太熟悉STL.

xto*_*ofl 8

是时候开始了解stl算法了:

#include <algorithm>

...

std::for_each( drugSack.begin(), drugSack.end(), 
  std::bind1st( std::mem_fun_ptr( &ThisClass::Sell ), this ) );
Run Code Online (Sandbox Code Playgroud)

我们的想法是创建一个称为"仿函数"的对象,该对象可以对范围中的每个元素执行特定操作drugSack.begin(), drugSack.end().

这个仿函数可以使用stl构造来创建mem_fun_ptr,从而产生一个带有a ThisClass*和一个Drug*参数的函子,以及一个用它来代替/绑定Class*for 的包装器this.


GMa*_*ckG 5

老实说,C++目前在这种方面非常糟糕.如xtofl的回答所述,它绝对可以做到,但它通常非常笨拙.

Boost有一个非常方便的for-each宏:

#include <boost/foreach.hpp>
#define foreach BOOST_FOREACH

// ...

foreach(Drug* d, drugSack)
{
    sell(d);
}
Run Code Online (Sandbox Code Playgroud)

或者也许是Boost.Bind,虽然这稍微复杂一点,但它对你的情况非常好看:

#include <boost/bind.hpp>

// ...

// ThisClass refers to whatever class this method is in
std::for_each(drugSack.begin(), drugSack.end(),
                boost::bind(&ThisClass::sell, this, _1));
Run Code Online (Sandbox Code Playgroud)

绑定将调用的成员函数函子ThisClass,sell上的类的实例指向this,将取代_1它从获得的参数for_each.

最通用的方法是使用lambda.Boost有一个lambda库.我不会在这里包含示例,因为对于你的特定情况,boost绑定有效,而lambda将是相同的代码.那就是说,兰巴可以做得更多!它们基本上创建就地函数(实现为函子),但学习起来要复杂得多.

在我看来,for-each和bind都比"标准"C++方法更清晰.现在,我建议按顺序:for-each,bind,标准C++,lambda.

在C++ 0x中,下一个C++标准,所有这一切都将很好,内置lambda支持:

std::for_each(drugSack.begin(), drugSack.end(),
                [this](DrugSack* d){ sell(d); });
Run Code Online (Sandbox Code Playgroud)

或者新的基于范围的for循环:

for(DrugSack* d : drugSack)
{
    sell(d);
}
Run Code Online (Sandbox Code Playgroud)

但是我们必须等待几年才可以选择.:(另外,我认为基于范围的for循环是最容易阅读的东西.这就是为什么我建议使用boost for-each,因为它模仿了这种行为和语法(主要是).

而且,完全不相关:根据this->我的经验,在你所有事情之前你所包含的风格通常被认为是不好的做法.编译器会为你做这件事,你所做的只是弄乱你的代码并引入错误的机会.没有它,事情会好得多.