在C ++ 11及更高版本中,<type_traits>
标头包含许多用于类型检查的类,例如std::is_empty
,std::is_polymorphic
,std::is_trivially_constructible
以及许多其他类。
虽然我们像普通类一样使用这些类,但我无法想出任何可能编写这些类定义的方法。没有任何数量的SFINAE(即使使用C ++ 14/17规则)或其他方法似乎能够判断一个类是多态的,空的还是满足其他属性。由于类必须具有唯一的地址,因此空的类仍占用正空间量。
那么,编译器如何在C ++中定义这样的类?或者也许必要让编译器本质上知道这些类名并特意解析它们?
答案 0 :(得分:2)
回到过去,当人们第一次愚弄类型特征时,他们写了一些非常讨厌的模板代码,试图编写可移植代码来检测某些属性。我对此的看法是,你必须在你的计算机下面放一个滴盘来捕获熔融金属,因为编译器过热试图编译这些东西。爱迪生设计集团(工业强度编译器前端提供商)的Steve Adamczyk对这个问题有了更具建设性的看法:不是编写所有需要大量编译时间并经常打破它们的模板代码,而是要求我提供一个辅助功能。
当首次正式引入类型特征时(在TR1,2006中),有几个特征没人知道如何实现可移植性。由于TR1应该是专门添加的库,因此它们不能指望编译器帮助,因此它们的规范允许它们得到偶尔错误的答案,但它们可以用可移植代码实现。
如今,这些津贴已被删除;图书馆必须得到正确的答案。编译器帮助这样做不是特定模板的特殊知识;它是一个函数调用,它告诉您特定类是否具有特定属性。编译器可以识别函数的名称,并提供适当的答案。这提供了一个较低级别的工具包,特征模板可以单独或组合使用,以确定该类是否具有相关特征。