假设我有一个对象 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/