0

假设我有一个对象向量。对于向量中的每个元素,我想通过一个成员调用一个函数。代码可以如下图所示。

class CMyClass
{
public:
   void g();
};

class CAnotherClass
{
public:
   void f();
   CMyClass m_object;
};

std::vector<CAnotherClass> vec;
// This is easy. What about m_object->g()?
std::for_each(vec.begin(), vec.end(), std::mem_fn(&CAnotherClass::f));

调用f()每个对象就像上面显示的一样简单。如果我想调用m_object->g()每个对象怎么办?希望我不想更改的接口CAnotherClass添加一个虚拟函数只是为了调用m_object->g().

是否有任何 STL/boost 方法可以在不自己编写循环的情况下做到这一点?

4

1 回答 1

6

您需要提供一个单独的功能,例如:

void call_g(CAnotherClass & c) { c.m_object.g(); }

然后将其传递给std::for_each.

std::for_each(vec.begin(), vec.end(), call_g);

如果您的编译器支持 C++11 特性 lambdas,情况会更好,因为您可以在使用点定义函数:

std::for_each(vec.begin(), vec.end(), [](CAnotherClass & c) { c.m_object.g(); });

但如果你的编译器支持 lambda,也许它支持循环范围,这是 C++11 的另一个特性。在我看来,循环的范围std::for_each已经过时了。它更简洁。

for (auto & c : vec) { c.m_object.g(); }
于 2013-01-10T04:54:03.570 回答