确定 C++ 类是不是具有私有析构函数
Posted
技术标签:
【中文标题】确定 C++ 类是不是具有私有析构函数【英文标题】: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 这里是一个更好的答案:***.com/q/631783/3093378 @mohaned -why would you create private destructor?
这样您就可以控制客户端如何创建/销毁您的类的实例。
【参考方案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
的析构函数是deleted
或private
和true
,则std::is_destructible<T>::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<T>::value
将返回 false
,因为它要求 表达式std::declval<U&>().˜U()
在被视为未评估的操作数时格式正确,其中在~U()
的情况下是无法访问的。或者,在 Visual Studio 中,您可以使用 boost 来克服这个错误功能。
在发布之前,我检查了标准的 Git 存储库副本;该措辞不清楚。我没有看到任何指定“在哪个上下文中”检查表达式的格式良好的内容。 std::declval<U&>().~U()
在 class U
或 friend
范围内格式正确。例如,pastebin.com/j3BvWkcm
如果一个表达式不会使程序定义不正确,那么它就是定义好的。为此,如果表达式std::declval<U&>().~U()
在U
的析构函数可访问的上下文中求值(例如,U
的成员函数、U
的声明friend
等),那么它是格式良好的并将被评估为void
。如果在 U
的析构函数不可访问的上下文中对其进行评估,则表达式格式错误,因为程序无法编译。类型特征使用 SFINAE。也就是说,如果std::is_destructible<T>::value
在T
的析构函数不可访问的上下文中进行评估...以上是关于确定 C++ 类是不是具有私有析构函数的主要内容,如果未能解决你的问题,请参考以下文章