◐ Shell
clean mode source ↗

変数テンプレート(C++14以上) - cppreference.com

提供: cppreference.com

変数テンプレートは変数または静的データメンバのファミリーを定義します。

構文

template < parameter-list > variable-declaration

説明

変数テンプレートは 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 関数テンプレートのいずれかとして実装されていました。

変数テンプレートをテンプレートテンプレート引数として使用することはできません。