名前空間
変種
操作

変数テンプレート(C++14以上)

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (C++20未満)
noexcept 指定子 (C++11)
例外
名前空間
指定子
decltype (C++11)
auto (C++11)
alignas (C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
 

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

[編集] 構文

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

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