変数テンプレート(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 関数テンプレートのいずれかとして実装されていました。
変数テンプレートをテンプレートテンプレート引数として使用することはできません。