変数テンプレート(C++14以上)
提供: cppreference.com
変数テンプレートは変数または静的データメンバのファミリーを定義します。
[編集] 構文
template < parameter-list > variable-declaration
|
|||||||||
[編集] 説明
variable-declaration | - | 変数の宣言。 宣言された変数の名前はテンプレートの名前になります。 |
parameter-list | - | 空でないコンマ区切りのテンプレート引数のリスト。 それぞれの引数は非型引数、型引数、テンプレート引数、またはそれらのいずれかのパラメータパック、のいずれかです。 |
変数テンプレートは declaration が変数を宣言する名前空間スコープのテンプレート宣言によって導入できます。
template<class T> constexpr T pi = T(3.1415926535897932385L); // 変数テンプレート。 template<class T> T circular_area(T r) // 関数テンプレート。 { return pi<T> * r * r; // pi<T> は変数テンプレートの実体化です。 }
クラススコープで使用されたときは、変数テンプレートは静的データメンバテンプレートを宣言します。
using namespace std::literals; struct matrix_constants { template<class T> using pauli = hermitian_matrix<T, 2>; // エイリアステンプレート。 template<class T> // 静的データメンバテンプレート。 static constexpr pauli<T> sigmaX = { { 0, 1 }, { 1, 0 } }; template<class T> static constexpr pauli<T> sigmaY = { { 0, -1i }, { 1i, 0 } }; template<class T> static constexpr pauli<T> sigmaZ = { { 1, 0 }, { 0, -1 } }; };
他の静的メンバと同様に、静的データメンバテンプレートの定義が要求される場合があります。 そのような定義はクラス定義の外側で提供されます。 名前空間スコープの静的データメンバのテンプレート宣言はクラステンプレートの非テンプレートデータメンバの定義でもあります。
struct limits { template<typename T> static const T min; // 静的データメンバテンプレートの宣言。 }; template<typename T> const T limits::min = { }; // 静的データメンバテンプレートの定義。 template<class T> class X { static T s; // クラステンプレートの非テンプレート静的データメンバの宣言。 }; template<class T> T X<T>::s = 0; // クラステンプレートの非テンプレートデータメンバの定義。
変数テンプレートは、明示的特殊化または明示的実体化されていなければ、その変数テンプレートの特殊化が使用されたときに、暗黙に実体化されます。
変数テンプレートのデフォルトテンプレート引数は、引数の値を要求する文脈でその変数テンプレートが使用されたときに、暗黙に実体化されます。
[編集] ノート
C++14 で変数テンプレートが導入されるまでは、パラメータ化された変数は一般的にクラステンプレートの静的データメンバまたは所望の値を返す constexpr 関数テンプレートのいずれかとして実装されていました。
変数テンプレートをテンプレートテンプレート引数として使用することはできません。