问题 如何实现std :: has_virtual_destructor?


怎么能 std::has_virtual_destructor 和类似的检查实施?我试过看了 type_traits Visual Studio中的标题,但有太多的宏和模板甚至可以得到一个想法。这种检查可以用任何合理简单的形式表达吗?我很想知道它的工作原理,因为现在我不知道。


3989
2017-09-28 18:06


起源

这是编译魔术。您无法在标准C ++中实现此功能。 Boost提供了这个trait类,它们使用编译器特定的内在函数。检查 这个标题 出。 - jrok
@jrok:你确定吗?为什么它不是编译器关键字呢?顺便说一句,我很确定Boost在C ++ 0x编译器之前就已经拥有它了。 - Violet Giraffe
查看更新的评论。 - jrok
@jrok任何可以与魔法区别开来的技术都不够先进:-) - Alan Stokes


答案:


许多类型特征需要编译器魔术:特征本质上为不同编译器提供的一些钩子提供了库接口。编译器如何实现这些钩子完全取决于它们,并且没有一致的接口。

在本次会议上讨论了如何在未来的修订版中添加反思,这可能最终会导致图书馆的实施,如果有这样的特征 std::has_virtual_destructor<T>。然而,在反思出现之前还需要一段时间。


13
2017-09-28 18:20



为什么他们这么多年没有标准化所述挂钩的界面? - Violet Giraffe
@VioletGiraffe他们不是那样做的吗? - jrok
@VioletGiraffe:您可以将traits接口视为钩子。在实践中,编译器供应商有不同的方法来实际公开功能,虽然我多年前曾要求创建一致的接口,但编译器供应商表示,必须遵守特定的方法会受到太多限制。 - Dietmar Kühl
@jrok:跟着 type_traits 模板?我不相信,如果他们这样做 - 这个问题将有一个具体的答案,单个实现将适用于任何符合标准的编译器。 - Violet Giraffe
@VioletGiraffe在某些时候,必须有一个隐藏不同编译器的不同方法的抽象层。它恰好发生了 std::has_virtual_destructor 是那层。这还不够吗? - jrok