如何初始化引用私有字段的静态const类成员对象?

时间:2016-07-26 14:21:29

标签: c++11 static-members member-function-pointers access-specifier

问题在于:名为Factory的类有几个具有相同签名的非静态成员函数,我们称之为f1f2等等。我想在一个std::vector的{​​{1}}中指出这些成员函数的指针,因为在运行时不需要改变它。同样,出于优雅的原因,我不想公开static const和其他人(下面简要f1),而不是fi,但那是次要的。

初始化类中的vector将无法正常工作,因为它是一个不完整的类型,当时vector是未知的。在文件级之外将其初始化将无法正常工作,因为&Factory::fi是私有的,我无法与全局范围成为朋友。将其置于初始化函数中并使fi 不起作用,因为这需要重写friend

有效的是:

  • 删除const限定符,但代价是为每个实例制作此static const的不必要副本。

  • 编写vector成员函数,声明static变量并返回它。我认为这样做会一样好,但它会使我的程序在所有优化的情况下运行速度慢两倍。

当然,我希望看到没有后者缺点的解决方案。请不要建议我从static或类似的范例变化来调用这些函数。

1 个答案:

答案 0 :(得分:1)

这是你的想法吗?从问题陈述中不太清楚。

#include <vector>

class Factory {
private:
    void f1() {}
    void f2() {}
public:
    typedef void (Factory::*PF)();
    static const std::vector<PF> v;
};

const std::vector<Factory::PF> Factory::v{&Factory::f1, &Factory::f2};


int main()
{
    Factory f;
    (f.*Factory::v[0])();
}

Demo