【问题标题】:Find the protection level of class member C++查找类成员 C++ 的保护级别
【发布时间】: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。

标签: c++ c++20


【解决方案1】:

有一篇论文在2018(以及后来的2019)中提出了这个建议。事实上,它似乎是 circulated in June of 2019 作为委员会提案流程的一部分。但是,我不太确定它发生了什么(除此之外,我想我找到了another revision)。

一些编译器可能会在实验上支持它。如果他们这样做了,我相信你会使用的标题是&lt;experimental/reflect&gt;(至少根据论文)。


否则,您会陷入困境。它显示为reflection was deferred to a later standard,因此在 C++ 中不存在这样的东西。希望它能成为 C++23。但现在我们必须等待。

【讨论】:

【解决方案2】:

不幸的是,您尝试做的事情是不可能的。到目前为止,C++ 还没有足够强大的反射特性。

实际上,程序员使用单例类而不需要像这样的保护机制,因为 C++ 不是为最大限度地进行编译时验证而设计的。还有很多其他类似的事情你不能在 C++ 中做——换句话说,C++ 不可能适应用户可能期望的每一个可能的特性,尤其是那些通常被认为不有用的特性。提出反射是因为很多人觉得它很有帮助,但到目前为止,C++ 中还没有包含等效的功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 2016-06-12
    相关资源
    最近更新 更多