2016-12-04 7 views
3

typedefを使用してテンプレートクラス(または構造体)の特殊化の名前を変更すると、そのタイプのテンプレートがアセンブリコード内でインスタンス化されますか?例えば:私は今、(基本的に)テンプレート型をtypedefするとインスタンス化できますか?

template<class T> struct Key 
{ 
    float _time = 0.0f; 
    T _value = T(); 
}; 
struct VectorKey 
{ 
    float _time = 0.0f; 
    glm::vec3 _value = glm::vec3(); 
}; 
struct QuatKey 
{ 
    float _time = 0.0f; 
    glm::quat _value = glm::quat(); 
}; 

それはtypedef内に含まれるように悪い考えだ場合、私は思ったんだけどを持つように

template<class T> struct Key 
{ 
    float _time = 0.0f; 
    T _value = T(); 
}; 
typedef Key<glm::vec3> VectorKey; 
typedef Key<glm::quat> QuatKey; 

これは私のファイルにKey<glm::vec3>Key<glm::quat>構造体を作成します。これが発生した場合、このヘッダーを含むファイルには不要なコードが含まれている可能性があります。

+0

「インスタンス化」とは何を意味するのかを説明します。 –

答えて

3

いいえ、typedefは純粋に構文です。テンプレートは、実際に使用された場合にのみインスタンス化されます。 C++ 14標準を1として

(まあ、the November draft私はISOの仕様に直接リンクすることはできませんので)(強調鉱山)

7.1.3 typedef指定
[... ]
typedef指定子で宣言された名前はtypedef-nameになります。その宣言の範囲内でtypedef-nameはキーワードと構文的に等価であり、8節で説明した方法で識別子に関連付けられた型の名前を付けます。typedef-nameは別の型の同義語です。 typedef-nameは、クラス宣言(9.1)または列挙宣言が新しい型を導入しないので、となります。

「テンプレートをインスタンス化する」という用語は、「新しいタイプを導入する」と同じことです。

コンパイル時に、新しいクラス/タイプ定義が見つかるたびに、それが "list-of-types"に追加されるとします。テンプレートが見つかるたびに、それはインスタンス化されるまで「型のリスト」に追加されません。

+0

これは私を驚かせます。標準への言及はありますか? – melpomene

+2

標準参照はありませんが、typedefがインスタンス化を引き起こした場合は[this](http://coliru.stacked-crooked.com/a/6f72c2702aba4283)はコンパイルされません。 –

+0

@MilesBudnekああ、もちろん。それは理にかなっている。 – melpomene

関連する問題