指向成员函数的指针向量与多个对象c ++

use*_*616 2 c++ function-pointers

考虑以下代码:

class A
{
public:
    void aFoo() {}
};

class B
{
public:
    void bFoo() {}
};

class C
{
public:
    void c1Foo() {}
    void c2Foo() {}
};
Run Code Online (Sandbox Code Playgroud)

无论代码架构如何,是否可以创建指向成员函数的指针向量,即使这些函数属于多个类?

在这种情况下,继承不是解决方案,因为我们不知道我们想在一个类中使用多少函数(C类有两个函数).但我们知道它们都有相同的原型.

Sho*_*hoe 9

不同类的成员函数有不同的类型.因此,为了拥有任何同类容器(如std::vectorstd::array那些),您需要将它们包装在一些可能代表它们的值类型中(如boost::variantboost::any).

另一方面,如果您需要的只是特定类型的成员函数(例如void()),并且您不介意传递应该在其上调用它们的对象,那么您可以将它们存储为std::function<void()>(对于此特定示例)并std::bind 在将它们存储在容器中之前调用它们.

举个例子,给出:

A a; B b; C c;
std::vector<std::function<void()>> vector {
    std::bind(&A::aFoo, a),
    std::bind(&B::bFoo, b),
    std::bind(&C::c1Foo, c),
    std::bind(&C::c2Foo, c)
};
Run Code Online (Sandbox Code Playgroud)

你可以打电话:

for (auto fn : vector)
    fn();
Run Code Online (Sandbox Code Playgroud)

Live demo