【发布时间】:2020-05-02 01:56:43
【问题描述】:
有没有办法知道会员的保护等级是多少?
我正在创建一个单例基类,我想确保子类将其构造函数/析构函数声明为私有/受保护。我该怎么做?
template<class c>
class singleton
{
static_assert(std::is_private<&c::c> // does this exist?
|| std::is_protected<&c::c>);
static_assert(std::is_private<&c::~c>
|| std::is_protected<&c::~c>);
};
【问题讨论】:
-
你甚至不能像那样引用构造函数和析构函数。 (我也不确定这种防篡改一般来说是个好主意。)
-
基类可以做的任何事情都不会要求其子类做任何此类事情。这在 C++ 中是不可能的。这听起来像是一个 XY 问题。您要解决的真正问题是什么?不,不是关于使子类满足此要求的问题,而是您认为解决方案是使子类满足此要求的任何问题,所以这就是您要问的问题?
-
This 你在找什么(在第 26 页左右。寻找
std::is_private)? -
@nowi:你不能静态阻止多个实例:如果派生类提供公共工厂函数怎么办?至于“权利”,你想要的严格降低了基类的效用;虽然这当然是主观的,但传统观点认为,这样的限制需要比“我不相信我的用户不会错过我课堂的全部要点”更强烈的动机。
-
在 c++ 命名空间是单例的:stackoverflow.com/a/5794619/5632316。 “一个定义规则”确保了唯一性。 C++ 不是 Java。