假设我们有一个 A 类,它有几个具有相同函数签名的 setter 函数,如以下代码。
class A
{
void setter1(int whatever)
{
set Something;
}
void setter2(int whatever)
{
set Something;
}
void setter3(int whatever)
{
set Something;
}
};
另一个类B有一个类A的对象。在类B的一个函数内部的某个地方,类A的所有这些函数都将被一一调用。
以下声明函数指针 std::list 的方法可以编译,但不能从 B 的函数的构造函数中调用它们
std::list<void (A::*)(int)> fncList = {&A::setter1, &A::setter2, A::setter2};
有没有其他方法来声明函数指针列表,以便我可以使用 B 类的任何函数?
谢谢
是的,这是可能的。但语法很糟糕。
static constexpr void (A::* const setters_of_a[])(int)
这声明了一个核心常量数组
setters_of_a
,其中包含指向 A
的成员指针,其类型为函数,采用 int
并返回 void
。
(a.*setter)(42);
这会调用对象
setter
上的成员指针 a
引用的成员函数。
#include <iostream>
struct A
{
void f(int) { std::cout << "A::f()\n";}
void g(int) { std::cout << "A::g()\n";}
};
struct B
{
A a;
static constexpr void (A::* const setters_of_a[])(int) = { &A::f, &A::g };
void set_a()
{
for (auto setter : setters_of_a) {
(a.*setter)(42);
}
}
};
int main()
{
B b;
b.set_a();
}