【问题标题】:How is std::has_virtual_destructor implemented?std::has_virtual_destructor 是如何实现的?
【发布时间】:2013-09-28 18:06:31
【问题描述】:

std::has_virtual_destructor 和类似的检查如何实施?我试过在 Visual Studio 中查看 type_traits 标头,但是宏和模板太多,甚至无法理解。这个检查可以用任何相当简单的形式表达吗?我很想至少知道它的工作原理,因为我现在不知道。

【问题讨论】:

  • 这是编译器的魔法。您无法在标准 C++ 中实现这一点。 Boost 提供了这个 trait 类,它们使用编译器特定的内在函数。签出this header
  • @jrok:你确定吗?为什么它不是编译器关键字呢?顺便说一句,我很确定 Boost 在 C++0x 编译器之前就有它。
  • @jrok 任何与魔法不同的技术都不够先进:-)

标签: c++ c++11 typetraits


【解决方案1】:

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

在当前的会议上,讨论了在未来的修订中添加反射,如果像 std::has_virtual_destructor<T> 这样的特征,最终可能会导致库实现。但是,反射之类的东西还需要一段时间才能出现。

【讨论】:

  • 这么多年他们为什么不把所说的钩子的接口标准化?
  • @VioletGiraffe 他们不就是这么做的吗?
  • @VioletGiraffe:您可以将特征接口视为钩子。在实践中,编译器供应商有不同的方法来实际公开功能,尽管我多年前曾要求创建一致的接口,但编译器供应商表示必须遵守特定的方法太受限制了。
  • @jrok:使用type_traits 模板?我不相信,如果他们这样做了 - 这个问题会有一个具体的答案,单个实现将适用于任何符合标准的编译器。
  • @VioletGiraffe 在某些时候必须有一个抽象层来隐藏不同编译器的不同方法。碰巧std::has_virtual_destructor 就是那个层。这还不够吗?
猜你喜欢
  • 2013-11-01
  • 2020-04-26
  • 2010-11-30
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-19
  • 2012-03-01
相关资源
最近更新 更多