一意の決定論的な名前を持つさまざまなデータ型をC++で生成したいと思います。例えば:
struct struct_int_double { int mem0; double mem1; };
現在、私のコンパイラはカウンタを使用して名前を合成します。つまり、同じデータ型を個別の変換単位でコンパイルする場合、名前は一致しません。
動作しないものは次のとおりです。
ABIMangled_name関数を使用します。すでに一意の名前を持つ構造体に依存しているためです。構造体が匿名であるふりをすることにより、C ++ 11準拠のABIで機能する可能性がありますか?
テンプレートは再帰型では機能しないため、struct2などのテンプレート。
完全なマングリング。あまりにも長い名前を付けるからです(数百文字!)
グローバルレジストリ(YUK!)とは別に、私が考えることができる唯一のことは、最初に一意の長いマングル名を作成し、次にダイジェストまたはハッシュ関数を使用してそれを短縮することです(衝突がないことを願っています)。
実際の問題:タプル、合計型、関数型など、型が匿名の場合に呼び出すことができるライブラリを生成する。
他のアイデアはありますか?
編集:再帰型問題の追加の説明。次のようなリンクリストを定義することを検討してください。
template<class T>
typedef pair<list<T>*, T> list;
これが実際に必要なことです。これは2つの理由で機能しません。1つは、typedefをテンプレート化できないことです。[いいえ、typedefを含むテンプレートクラスは使用できません。機能しません]次に、list *はまだ定義されていないため、引数として渡すことはできません。ポリモーフィズムのないCでは、次のことができます。
struct list_int { struct list_int *next; int value; };
いくつかの回避策があります。この特定の問題については、Barton-Nackmanトリックの変形を使用できますが、一般化されていません。
一般的な回避策があります。最初にGabrielledesRoisによって示され、オープン再帰のテンプレートを使用し、次に部分的に特殊化してそれを閉じます。しかし、これを生成することは非常に困難であり、私がそれを行う方法を理解できたとしても、おそらく読めないでしょう。
バリアントを適切に実行することにも別の問題がありますが、それは直接関係していません(構築可能な型で結合を宣言することに対する愚かな制限のため、さらに悪いことになります)。
したがって、私のコンパイラは単に通常のC型を使用します。とにかくポリモーフィズムを処理する必要があります。それを作成する理由の1つは、テンプレートを含むC++型システムの問題を回避することでした。これにより、名前の問題が発生します。