クラステンプレートは、1つ以上のテンプレートパラメータに基づいて一連のクラスを定義するテンプレートです。関数テンプレートは、1つ以上のテンプレートパラメータに基づいて一連の関数を定義するテンプレートです。 vector
はテンプレートクラスです。 vector<int>
は、そのテンプレートからインスタンス化された特定のクラスです。
template<typename T>
T variable_name{};
変数テンプレートである:
変数テンプレートは、従って、一つ以上のテンプレートパラメータに基づいて、変数のシリーズを定義するテンプレートです。どのテンプレートを他のテンプレートと同じように指定するかは、variable_name<int>
はint
となります。 variable_name
は、テンプレートです。 variable_name<int>
は実際には変数です。
もちろん、あなたがより複雑なことを行うことができます。
template<typename T>
vector<T> vector_var{};
vector_var<int>
がvector<int>
です。
変数テンプレートは、namespace/globalスコープおよびクラスの静的メンバーとしてのみ導入できます。名前空間/グローバルスコープでは、通常、constexpr
(および/またはC++ 17,inline
)と宣言されています。彼らは、定数を作製するのに有用だ:あなたは何かがデフォルト構築可能である場合に伝えたい場合
template<typename T>
inline constexpr bool is_default_constructible_v = std::is_default_constructible<T>::value;
だから、あなたは少しぎこちない::value
構文は必要ありません。
変数テンプレートはC++ 14の機能です。これは、コンパイラがおそらくC++ 11モードでの使用について警告していたからです。
image<T> *im = new image<T>(w, h, false);
これはない変数テンプレートです。これは、タイプが非常によく定義されている通常の変数です:image<T>
。変数「im
」とまったく同じものがあります。変数を取得するのにim<T>
を使用しないでください。
この文は、変数ファミリを定義していません。あなたが持っているものは、ファンクションのファミリーです。それぞれにはという変数があり、im
という変数があります。関数は変数ではなく、ここにテンプレートです。
ここには、[変数テンプレート](http://en.cppreference.com/w/cpp/language/variable_template)があります。 [cppreference。com](http://en.cppreference.com/w/)。 – Ron
私もこのサイトを見て、それが特に役立つとは思えませんでした。これは、 "変数テンプレートは、変数のファミリーまたは静的データメンバーを定義します。"いくつかの例があります。私の例のコードは、私にとって、cppreferenceの定義の限られた情報に基づくさらなる例であるようです。それはなぜですか? – Scott
これは変数テンプレートのようには見えません。メンバーテンプレートのようなものです。 – VTT