STL/boost方式为向量内的每个对象间接调用方法

Eri*_*c Z 0 c++ boost stl

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

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));
Run Code Online (Sandbox Code Playgroud)

调用f()每个对象就像上面显示的那样简单.如果我想调用m_object->g()每个对象怎么办?希望我不想改变界面CAnotherClass来添加一个虚拟函数来调用m_object->g().

是否有任何STL/boost方式来自己编写循环?

Ben*_*ley 6

你需要提供一个单独的功能,如下所示:

void call_g(CAnotherClass & c) { c.m_object.g(); }
Run Code Online (Sandbox Code Playgroud)

然后传递给std::for_each.

std::for_each(vec.begin(), vec.end(), call_g);
Run Code Online (Sandbox Code Playgroud)

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

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

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

for (auto & c : vec) { c.m_object.g(); }
Run Code Online (Sandbox Code Playgroud)