c++ - STL/boost 方法为 vector 中的每个对象重复间接调用方法

标签 c++ boost stl

假设我有一个对象 vector 。对于 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() 怎么办?希望我不想更改 CAnotherClass 的接口(interface)来添加一个虚拟函数来调用 m_object->g()

是否有任何 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(); });

但是,如果您的编译器支持 lambda,它可能会支持 range for loops,这是另一个 C++11 特性。在我看来,range for 循环使 std::for_each 过时了。它更简洁。

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

关于c++ - STL/boost 方法为 vector 中的每个对象重复间接调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14251001/

相关文章:

c++ - 如何隐藏或禁用 WIX 安装程序中的取消按钮?

c++ - QOpenGLWidget 粉碎显示

c++ - 我应该用/MD 还是/MT 编译?

c++ - 计算幅度 <1 和幅度 >1 时的精度损失

c++ - STL deque 实现的每个 "vectors"是否总是具有相同的大小?

c++ - 使用 C++ STL 库查找变量模式

c++ - 如果输入是安全的,是否有可能利用易受攻击的函数?

c++ - boost::variant 的迭代器

c++ - boost tcp_server async_write 错误 : access violation writing location

c++ - std::search() 的返回类型