如何初始化引用私有字段的 static const class 成员对象?
How can I initialize static const class member object referring to private fields?
问题来了:一个叫做Factory
的class有几个相同签名的非静态成员函数,我们称它们为f1
、f2
等等.我想将指向这些成员函数的指针放在 std::vector
中,即 static const
,因为它不需要在 运行 时间内更改。同样,出于优雅的原因,我不想公开 f1
和其他人(下面总结为 fi
),也不想公开 vector
,但那是次要的。
初始化class中的vector
不会起作用因为它是一个不完整的类型,&Factory::fi
当时未知。在文件级别外部初始化它 将不起作用 因为 fi
是私有的,我无法与全局范围成为朋友。将其放入初始化函数并使其成为 friend
将不起作用 因为这需要重写 const
.
有效的是:
删除 static const
限定符,代价是为每个实例制作此 vector
的不必要副本。
编写一个 static
成员函数,声明一个 static
变量并 returns 它。我认为这会同样好,但它使我的程序 运行 在所有优化打开的情况下慢了一倍。
当然,我希望看到没有后者缺点的解决方案。请不要建议我从 switch
或范例的类似巨大变化中调用函数。
这是你的想法吗?从问题陈述来看不是很清楚。
#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])();
}
问题来了:一个叫做Factory
的class有几个相同签名的非静态成员函数,我们称它们为f1
、f2
等等.我想将指向这些成员函数的指针放在 std::vector
中,即 static const
,因为它不需要在 运行 时间内更改。同样,出于优雅的原因,我不想公开 f1
和其他人(下面总结为 fi
),也不想公开 vector
,但那是次要的。
初始化class中的vector
不会起作用因为它是一个不完整的类型,&Factory::fi
当时未知。在文件级别外部初始化它 将不起作用 因为 fi
是私有的,我无法与全局范围成为朋友。将其放入初始化函数并使其成为 friend
将不起作用 因为这需要重写 const
.
有效的是:
删除
static const
限定符,代价是为每个实例制作此vector
的不必要副本。编写一个
static
成员函数,声明一个static
变量并 returns 它。我认为这会同样好,但它使我的程序 运行 在所有优化打开的情况下慢了一倍。
当然,我希望看到没有后者缺点的解决方案。请不要建议我从 switch
或范例的类似巨大变化中调用函数。
这是你的想法吗?从问题陈述来看不是很清楚。
#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])();
}