如何创建与不同对象耦合的成员函数指针数组?

How can I create an array of member function pointers coupled with different objects?

假设我有 class A 函数 foo(int i) 和 class B 函数 bar(int i),以及 objectA(classA)和objectB(classB)。我可以像这样调用函数

objectA.foo(10);
objectB.bar(20);

我想做的是将它们都作为数组中的函数指针 arr 并像这样调用它们

arr[0](10);
arr[1](20);

有没有办法在 C++ 中执行此操作?如果是,效率如何?

您可以将 std::function 对象存储在 std::vector 中,该对象是通过捕获 objectAobjectB 的 lambda 函数创建的。调用 std::function 对象会带来一些开销,因此如果时间紧迫,您必须衡量它是否足够好。

示例:

#include <functional>
#include <iostream>
#include <vector>

struct A {
    void foo(int x) { std::cout << "A::foo " << x << '\n'; }
};

struct B {
    void bar(int x) { std::cout << "B::bar " << x << '\n'; }
};

int main() {
    A objectA;
    B objectB;
    std::vector< std::function<void(int)> > arr{
        [&objectA](int x) { objectA.foo(x); },
        [&objectB](int x) { objectB.bar(x); },
    };
    arr[0](10);
    arr[1](20);
}

输出:

A::foo 10
B::bar 20

类似于 @ted-lyngmo 的回答,但对于 C++20,您还可以使用 std::bind_front 为向量创建函数对象:

int main()
{
    A objectA;
    B objectB;
    std::vector<std::function<void(int)>> arr{
        std::bind_front(&A::foo, objectA),
        std::bind_front(&B::bar, objectB)
    };
    arr[0](10);
    arr[1](20);
}

Godbolt