私はC++でさまざまなデータ型を生成したいと思います。たとえば:ユニークな合成名
struct struct_int_double { int mem0; double mem1; };
現時点で私のコンパイラは、異なる翻訳単位で同じデータ型をコンパイルするときに名前が一致しないことカウンタを使用して、名前を合成します。
は、ここでは動作しません何:ABIのmangled_name機能を使用して
。一意の名前を持つ構造体にはすでに依存しているからです。構造体を匿名で偽装してC++ 11準拠のABIで動作する可能性がありますか?
テンプレート(例:テンプレートは再帰型では機能しないため、struct2)
完全なマングリング。それはその後、私は考えることができる唯一のことは、最初のユニークな長いマングル名を作成することですあまりにも長い間されている名前(文字の数百!)別にグローバルレジストリ(YUK!)から
を与え、そしてのでそれを短縮するためにダイジェストまたはハッシュ関数を使用します(そして、衝突がないことを望みます)。
実際の問題:型が匿名である場所、たとえばタプル、合計型、関数型などと呼ばれるライブラリを生成する。
他のアイデアはありますか?
EDIT:再帰型問題の追加説明。
template<class T>
typedef pair<list<T>*, T> list;
これは実際に必要なものです。これは2つの理由から機能しません。まず、typedefをテンプレート化できません。 [いいえ、あなたはtypedefでテンプレートクラスを使うことはできません。それはうまくいきません]次に、リスト*がまだ定義されていないので引数として渡すことができません。多型を持たないCでは、あなたはそれを行うことができます:
struct list_int { struct list_int *next; int value; };
いくつかの回避策があります。このの場合、特にの問題では、Barton-Nackmanの変種を使うことができますが、それは一般化しません。
一般的な回避策があります.Gabrielle des Roisが最初に私に示したのは、開いた再帰を伴うテンプレートを使用し、それを閉じるための部分的な特殊化です。しかし、これは生成するのが非常に難しく、たとえそれを行う方法を見つけ出すことができても、おそらく判読できないでしょう。
バリアントも正しく処理するのに問題がありますが、それは直接関係しません(構築可能な型を持つ構造体を宣言することに対する愚かな制限のために悪化します)。
したがって、私のコンパイラは単純に通常のC型を使用します。それは多様性をとにかく扱わなければなりません:それを書く理由の1つは、テンプレートを含むC++型システムの問題を回避することでした。これにより、命名の問題が発生します。
'std :: tuple'の何が問題なのですか? (または 'std :: tr1 :: tuple')実際にここで何を達成しようとしていますか? –
'.memN'の代わりに' .get() 'の何が問題になっていますか? –
@Billy:std :: tupleのようなものはありません(とにかくC++ 98で)。 C++ 11がこれを持っていて、それがテンプレートだと(テンプレートは再帰型を扱うことができません)、OSXの現在のg ++がC++ 11のサポートをあまり持っていないので、私はそれを使いたくないです(残念です)。 – Yttrill