是否可以将一个类的成员函数的指针列表作为调用这些函数的另一个类的成员?

问题描述 投票:0回答:1

假设我们有一个 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 类的任何函数?

谢谢

c++ function-pointers stdlist
1个回答
0
投票

是的,这是可能的。但语法很糟糕。

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();
}

编译器资源管理器演示

© www.soinside.com 2019 - 2024. All rights reserved.