'typedef'で定義された型にフィールド/メソッドを追加する方法はありますか?
最初に答える必要があるのは、typedef
実際の意味です。Aは既存のタイプのエイリアスtypedef
を作成しますが、新しいタイプは作成しません。新しい名前の後は、元の名前とまったく同じタイプを参照し、ほとんどのコンテキストで両方の名前を同じ意味で使用できます*。typedef
typedef
それが明確になると、答えは明白に見えます。エイリアスは他のタイプを正確に参照しているため、エイリアスに機能を追加したり、エイリアスから機能を削除したりすることはできません。2つのタイプはなく、1つだけです。オリジナルです。
*元のタイプと、aを介して作成されたエイリアスは、typedef
ほとんど違いはありませんが、100%同等ではありません。特に、元のタイプの名前(ユーザー定義であると想定)は、関数、変数、またはエイリアスstd::vector<X>
とは異なる識別子スペースにあります。typedef
名前は型のtypedef
名前ではなく、型のエイリアスです。次のコードは、違いの1つを示しています。
struct A {};
typedef A B;
struct A a; // creates a variable `a` of type `A`
//struct B b; // error, `B` is a typedef, not a `struct`
最も顕著な違いのいくつかは、複数の翻訳ユニットをコンパイルする場合にのみ明確になります。typedef
エイリアスは常に翻訳ユニットの内部にあります。オブジェクトファイルで生成されたシンボルは、を参照しませんtypedef
。コンパイラはtypedef
実際の型を解決し、すべての記号と名前マングリングは実際の型が使用されたかのように実行されます。