如何创建与不同对象耦合的成员函数指针数组?
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
中,该对象是通过捕获 objectA
或 objectB
的 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);
}
假设我有 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
中,该对象是通过捕获 objectA
或 objectB
的 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);
}