类型的编译时排序

时间:2012-03-10 18:49:30

标签: c++

我一直在寻找一种在编译时获取类型排序的方法。例如,这对于实现(高效)编译时类型集很有用。

一种显而易见的方法是,如果有办法将每种类型映射到一个唯一的整数。关于该主题的previous question的答案简明扼要地捕捉了为什么这很困难,似乎它同样适用于任何其他尝试获得排序的方式:

  

编译器无法知道所有编译单元,并且链接器没有类型

的概念

实际上,对编译器的挑战是相当大的:它必须确保在任何调用中,对于任何源文件,它返回给定类型的相同整数/它返回任意两个给定类型之间的相同顺序,但与此同时,类型的范围是开放的,它不知道当前文件之外的任何类型。一个难题。

我的想法是类型有名字。根据C ++的定律,据我所知,类型的完全限定名称在整个程序中必须是唯一的,否则您将获得某种或其他类型的错误或未定义的行为。

  • 如果两种类型具有相同的名称,则它们的类型相同。

  • 如果两种类型的类型相同,则它们具有相同的名称,或者它们是彼此的typedef。编译器完全了解typedef。

名称是字符串,字符串具有排序。因此,如果我说得对,您可以根据名称在类型上定义全局一致的排序。更具体地说,任何两种类型之间的顺序是完全解析了typedef的类型名称之间的顺序。 (类型行为与typedef不同会有问题。)

当然,标准C ++没有任何检索类型名称的工具。

我的问题是:

  • 我有什么不对吗?从理论上讲,这有什么理由不起作用吗?

  • 是否有任何编译器可以在编译时作为语言扩展来访问类型名称(理想情况下是他们的typedef-resolved表单)?

  • 还有其他办法吗?有没有编译器呢?

(我认识到在同一个问题中提出不止一个问题是不礼貌的,但是在他们之前用相同的基本喉咙清除发布三个单独的问题似乎很奇怪。)

1 个答案:

答案 0 :(得分:1)

  

类型的完全限定名称在整个程序中必须是唯一的

但是,当然,只有在不同的翻译单元中考虑单独的匿名命名空间才能在某种意义上拥有不同的名称,并且有一些方法可以弄清楚它们是什么。

我意识到他们确实有不同名称的唯一意义是错误的链接符号;你可能(取决于编译器)能够从type_info::name()获得,但不保证,仅限于带有RTTI的类型,并且无论如何似乎都没有声明作为constexpr,因此您无法在编译时使用该值。

type_info::before()产生的排序自然具有相同的限制。

出于兴趣,您希望通过编译时类型排序实现什么目标?