2011-11-07 6 views
6

は考える:C++のどのような機能により、テンプレートクラスはテンプレート引数なしで自分自身を参照できますか?

template <typename T> 
class C { 
    C & operator ++() { ... } 
}; 

/どのようCではなくC<T>に名前を付けるために要求されるよりも、タイプCの変数や関数を宣言することが許可されているのはなぜ?私は実際にはそれについて考えていなかったが、多くのパラメータを持つテンプレートを使って "自己タイプ"の不便を払拭していました。

私には知っておくべきことがありますか?

答えて

6

[n3290: 14.6.1/1]:クラス テンプレートは、(第9条)を注入し、クラス名を持っています。 注射クラス名は、テンプレート名またはタイプ名として使用できます。 それはテンプレートテンプレートパラメータ、または友人のクラスの詳述型指定子の最後の識別子であるため テンプレート引数として、テンプレート引数リストで使用され テンプレート宣言では、クラステンプレート自体を参照します。 はそうでない場合は、それは テンプレートパラメータ<>で囲まれたクラステンプレートの続いテンプレート名に相当します。

表面的には、それは単なる便利な機能です。

+3

アメイジングしなければなりませんスタンダード - スタンダードの何点かは、明らかに - 否定できない! –

+0

ああ、私が見逃していたコンセプトは*注射クラス名*でした。ありがとう! –

+0

@BenJackson:問題ありません! –

2

文法的な砂糖です。

テンプレートパラメータを変更する必要がある場合は、メソッドのシグネチャを変更する必要はありません。通常の(非テンプレート)クラスと同様

2

Cは、Cに名前を付ける代わりに、Cタイプの変数と関数を宣言することができますか?

これはちょうどこのように指定されています。テンプレートの名前は本体に挿入され、実際の型(引数付き)を意味します。

私には知っておくべきことがありますか?

大したことはありません。あなただけのCRTPを行うにはので、基底クラスでは動作しません。これを覚えておく必要があり、私は間違って通過;-)引用の電源を引用したのだながら、次の2つの人々がこれをupvotedこと

template <class T> 
class A : public Base<A<T> > // not Base<A> 
+2

'Base'がテンプレートテンプレートパラメータを必要とする場合を除いて。 ;) – Xeo

+0

@Xeo:はい、CRTPでは、基本クラスは派生型を予期しています。 – jpalecek

+0

一方は他方を除外しません。 – Xeo

関連する問題