【问题标题】:How does the compiler define the classes in type_traits?编译器如何定义 type_traits 中的类?
【发布时间】:2017-07-08 08:41:30
【问题描述】:

在 C++11 及更高版本中,<type_traits> 标头包含许多用于类型检查的类,例如 std::is_emptystd::is_polymorphicstd::is_trivially_constructible 和许多其他类。

虽然我们像普通类一样使用这些类,但我想不出任何方法来编写这些类的定义。没有多少 SFINAE(即使使用 C++14/17 规则)或其他方法似乎能够判断一个类是多态的、空的还是满足其他属性。为空的类仍会占用正数空间,因为该类必须具有唯一的地址。

那么,编译器如何在 C++ 中定义这样的类?或者编译器可能有必要了解这些类名并专门解析它们?

【问题讨论】:

标签: c++ c++11 typetraits


【解决方案1】:

在过去,当人们第一次玩弄类型特征时,他们编写了一些非常讨厌的模板代码,试图编写可移植的代码来检测某些属性。我对此的看法是,当编译器在试图编译这些东西时过热时,你必须在计算机下方放置一个滴盘来捕捉熔融金属。 Edison Design Group(工业级编译器前端供应商)的 Steve Adamczyk 对这个问题提出了更具建设性的看法:与其编写所有这些需要大量编译器时间并经常破坏它们的模板代码,不如让我提供一个辅助函数。

当类型特征第一次被正式引入时(TR1, 2006),有几个特征没有人知道如何可移植地实现。由于 TR1 应该是专门的库添加,这些不能指望编译器的帮助,所以他们的规范允许他们得到一个偶尔错误的答案,但他们可以在可移植的代码中实现。

如今,这些津贴已被取消;图书馆必须得到正确的答案。执行此操作的编译器帮助不是特定模板的特殊知识;它是一个函数调用,告诉您特定类是否具有特定属性。编译器可以识别函数的名称,并提供适当的答案。这提供了一个较低级别的工具包,特征模板可以单独或组合使用该工具包来确定类是否具有相关特征。

【讨论】:

    猜你喜欢
    • 2012-10-02
    • 2013-07-14
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 2021-02-07
    相关资源
    最近更新 更多