STL/boost方法间接调用一个方法重复为每个对象在一个向量

STL/boost way to indirectly call a method repeatly for each object inside a vector

本文关键字:方法 一个 向量 对象 STL boost 调用      更新时间:2023-10-16

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

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()呢?希望我不要为了调用m_object->g()而改变CAnotherClass的接口,添加一个虚拟函数。

是否有任何STL/boost方法来做到这一点,而不是自己编写循环?

您需要提供一个单独的函数,如下所示:

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

然后传递给std::for_each

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

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

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

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

for (auto & c : vec) { c.m_object.g(); }