gpt4 book ai didi

c++ - 类型的编译时排序

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:19:23 30 4
gpt4 key购买 nike

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

一个显而易见的方法是,如果有一种方法可以将每种类型映射到一个唯一的整数。 previous question 的答案关于该主题的内容简洁地说明了为什么这很困难,而且它似乎同样适用于尝试获得订单的任何其他方式:

the compiler has no way of knowing all compilation units and the linker has no concept of a type

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

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

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

  • 如果两个类型是同一类型,那么它们要么具有相同的名称,要么是彼此的 typedef。编译器完全了解 typedef。

名称是字符串,字符串有顺序。因此,如果我没记错的话,您可以根据类型的名称定义全局一致的排序。更具体地说,任何两种类型之间的顺序将是类型名称之间的顺序,其中 typedef 已完全解析。 (让一个类型的行为与其 typedef 不同会产生问题。)

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

我的问题是:

  • 我有什么问题吗?这在理论上行不通,有什么原因吗?

  • 是否有任何编译器可以让您在编译时访问类型名称(最好是它们的 typedef 解析形式)作为语言扩展?

  • 还有其他方法吗?有编译器吗?

(我知道在同一个问题中问多个问题是不礼貌的,但是发布三个单独的问题并在它们之前进行相同的基本清嗓子似乎很奇怪。)

最佳答案

the fully qualified name of a type must be unique across the entire program

当然,只有当您认为不同翻译单元中的独立匿名 namespace 在某种意义上具有不同的名称,并且有某种方法可以弄清楚它们是什么时,这才是正确的。

我知道它们确实具有不同名称的唯一意义是在损坏的链接器符号中;您可能(取决于编译器)能够从 type_info::name() 获取它,但不能保证,仅限于具有 RTTI 的类型,并且anyway 似乎没有被声明为 constexpr 因此您不能在编译时使用该值。

type_info::before() 产生的顺序自然也有同样的限制。

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

关于c++ - 类型的编译时排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9649166/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com