假设有一个类对象向量。
vector<Object1> vec;
说,Object1
有一个成员函数void foo(Object2*)
。
我想做以下事情:
for(int i=0; i<vec.size(); i++) {
vec[i].foo(obj2);
}
在不使用显式循环的情况下如何做到这一点?
使用 TR1/C++11 最简单:
#include <vector>
#include <functional>
#include <algorithm>
struct Object2{};
struct Object1 {
void foo(Object2*) {}
};
int main() {
std::vector<Object1> vec;
Object2 obj2;
std::for_each(vec.begin(), vec.end(), std::bind(&Object1::foo, std::placeholders::_1, &obj2));
}
但是您也可以使用std::for_each
with std::bind2nd
,std::mem_fun_ref
如果这不是一个选项:
std::for_each(vec.begin(), vec.end(), std::bind2nd(std::mem_fun_ref(&Object1::foo), &obj2));
一种较旧的风格是手动编写仿函数。对于更复杂的逻辑,这允许您将整个班级专门用于解决问题。
class fancyFunctor
{
Object2* m_data;
public:
fancyFunctor(Object2 * data) : m_data(data){}
operator()(Object1 & ref)
{
ref.foo(m_data)
}
}
然后迭代:
std::for_each(vec.begin(),vec.end(), fancyFunctor(&randomObject2));
此类代码的可读性并不完美,并且不能以任何简单的单行方式完成。这是因为,某个类的成员方法的第一个参数是指向该类的对象的指针,它将在该对象上执行。
或者,您可以使用新 C++11 标准附带的 foreach 循环(但它仍然是循环)。