【问题标题】:Determining whether a C++ class has a private destructor确定 C++ 类是否具有私有析构函数
【发布时间】:2014-10-08 15:37:18
【问题描述】:

假设我有以下代码:

class Example
{
#ifndef PRIVATE_DESTRUCTOR
public:
#endif
    ~Example() { }
public:
    friend class Friend;
};

class Friend
{
public:
    void Member();
};

void Friend::Member()
{
    std::printf("Example's destructor is %s.\n",
        IsDestructorPrivate<Example>::value ? "private" : "public");
}

是否可以实现上面的IsDestructorPrivate模板来判断一个类的析构函数是private还是protected

在我正在使用的情况下,我需要使用此IsDestructorPrivate 的唯一时间是在可以访问此类私有析构函数(如果存在)的地方。它不一定存在。 IsDestructorPrivate 可以是宏而不是模板(或解析为模板的宏)。 C++11 很好。

【问题讨论】:

  • 为什么要创建私有析构函数?
  • AFAIK 无法检查可访问性。理想情况下,您不应该编写依赖于此的代码。
  • @mohaned 可能有类似单身的行为?
  • @mohaned 这里是一个更好的答案:stackoverflow.com/q/631783/3093378
  • @mohaned - why would you create private destructor? 这样您就可以控制客户端如何创建/销毁您的类的实例。

标签: c++ c++11 destructor private


【解决方案1】:

您可以使用std::is_destructible 类型特征,如下例所示:

#include <iostream>
#include <type_traits>

class Foo {
  ~Foo() {}
};

int main() {
  std::cout << std::boolalpha << std::is_destructible<Foo>::value << std::endl;
}

LIVE DEMO

如果T 的析构函数是deletedprivatetrue,则std::is_destructible&lt;T&gt;::value 将等于false

【讨论】:

  • 该死的。这在 Visual Studio 2010 中不存在,plain 在 Visual Studio 2013 中不起作用。connect.microsoft.com/VisualStudio/feedback/details/811436/…
  • 此外,标准似乎不清楚 std::is_destructible 实际上是否应该为私有/受保护的析构函数返回 false。
  • @Myria 您已经发现 Visual Studio 在使用 std::is_destructible 类型特征时存在问题。恕我直言,我认为标准很明确,如果析构函数不可访问,std::is_destructible&lt;T&gt;::value 将返回 false,因为它要求 表达式std::declval&lt;U&amp;&gt;().˜U() 在被视为未评估的操作数时格式正确,其中在~U() 的情况下是无法访问的。或者,在 Visual Studio 中,您可以使用 boost 来克服这个错误功能。
  • 在发布之前,我检查了标准的 Git 存储库副本;该措辞不清楚。我没有看到任何指定“在哪个上下文中”检查表达式的格式良好的内容。 std::declval&lt;U&amp;&gt;().~U()class Ufriend 范围内格式正确。例如,pastebin.com/j3BvWkcm
  • 如果一个表达式不会使程序定义不正确,那么它就是定义好的。为此,如果表达式std::declval&lt;U&amp;&gt;().~U()U 的析构函数可访问的上下文中求值(例如,U 的成员函数、U 的声明friend 等),那么它是格式良好的并将被评估为void。如果在 U 的析构函数不可访问的上下文中对其进行评估,则表达式格式错误,因为程序无法编译。类型特征使用 SFINAE。也就是说,如果std::is_destructible&lt;T&gt;::valueT 的析构函数不可访问的上下文中进行评估...
猜你喜欢
  • 2012-09-09
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多