2011-09-23 21 views
6

Bjarne Stroustrup C++ Book(第13章、331ページ)では、「テンプレートパラメータを後続のテンプレートパラメータの定義に使用できる」と述べました。そして、それは次のコードを与える:テンプレートのパラメータはタイプでなければなりませんか?

template<class T, T def_val> class Cont{ /* ... */ } 

誰でもこのテンプレートの使い方の例を提供することができます。たとえば、Contのオブジェクトを初期化する方法は? "def_val"は型引数ではないので、<>に配置しないでください。私が間違っている?

どうもありがとう

+3

これは、Tが整数型の場合にのみ有効であることを知っておくべきです – Riga

答えて

7

あなたはこのような何かを行うことができます。

Cont<int, 6> cnt; 
//  ^as long as this is of type T (in this case int) 
// def_val will be of type int and have a value of 6 

テンプレートのパラメータがタイプである必要はありません。 @Rigaが彼/彼女のコメントで述べたようにTは、整数型(などintunsignedlongcharなどではなくfloatstd::stringconst char*、)であるとき

これはのみ動作します。

6

def_valは、value引数です。インスタンス化は次のようになります。あなたは、テンプレートparemeterとしてクラスメンバへのポインタを持っているしたい場合、これは便利です

Cont<int, 1> foo; 

興味深いケースは次のとおりです。

template<class C, int C::*P> 
void foo(C * instance); 

これがあることをfooを可能にしますどのクラスのタイプintのメンバへのポインタでインスタンス化されます。

+2

正しい用語は 'non-type template parameter'です。 – pmr

3

ここで上記をインスタンス化する方法の例は次のとおり

template<class T, T def_val> class Cont{ /* ... */ }; 

int main() 
{ 
    Cont<int,42> c; 
} 
2

T def_valは(以前に渡された)タイプTの目的です。たとえば、コンテナ内の項目を初期化するために使用できます。その後、第2のテンプレートパラメータを使用しています

;

Object init(0); 
Cont<Object, init> cont; 

Objectは明らかに、このように使用する法定の型でなければならない擬似コード):使用するには、次のようになります。テンプレート化された型を持つため、テンプレートに含まれています。 def_valはタイプTである必要があり、オブジェクトの作成時に渡す必要があります。

+0

これが動作するかどうかわかりません。オブジェクトのコンストラクタがconstexprの場合は? –

+0

免責事項を少し追加しました。 – ssube

関連する問題