我想在 C++ 中生成具有唯一确定性名称的各种数据类型。例如:
struct struct_int_double { int mem0; double mem1; };
目前我的编译器使用计数器合成名称,这意味着在不同翻译单元中编译相同数据类型时名称不一致。
这是行不通的:
使用 ABI mangled_name 函数。因为它已经依赖于具有唯一名称的结构。通过假装结构是匿名的,可以在符合 C++11 的 ABI 中工作吗?
模板,例如 struct2,因为模板不适用于递归类型。
一个完整的修改。因为它给出的名字太长了(数百个字符!)
除了全局注册表(YUK!)之外,我唯一能想到的就是首先创建一个独特的长名称,然后使用摘要或散列函数来缩短它(希望没有冲突)。
实际问题:生成可以在类型为匿名的情况下调用的库,例如元组、求和类型、函数类型。
还有其他想法吗?
编辑:递归类型问题的补充说明。考虑定义这样的链表:
template<class T>
typedef pair<list<T>*, T> list;
这实际上是需要的。它不起作用有两个原因:首先,您不能对 typedef 进行模板化。[不,您不能使用带有 typedef 的模板类,它不起作用] 其次,您不能将 list* 作为参数传递,因为它尚未定义。在没有多态性的 C 中,您可以这样做:
struct list_int { struct list_int *next; int value; };
有几种解决方法。对于这个特定的问题,您可以使用 Barton-Nackman 技巧的变体,但它并不能一概而论。
有一个通用的解决方法,首先由 Gabrielle des Rois 向我展示,使用具有开放递归的模板,然后使用部分特化来关闭它。但这非常难以生成,即使我能弄清楚如何做到这一点,也可能无法阅读。
正确地做变体还有另一个问题,但这不是直接相关的(更糟糕的是,因为对声明具有可构造类型的联合的愚蠢限制)。
因此,我的编译器只是使用普通的 C 类型。无论如何,它必须处理多态性:编写它的原因之一是绕过包括模板在内的 C++ 类型系统的问题。这会导致命名问题。