関数とクラスのテンプレート化には慣れていますが、これを見たときにどうすればよいかわかりませんでした。おそらくほとんどの人にとって日常的な構文だと確信していますが、誰かが私のために説明を持っている場合は、明確な説明を求めたいと思います。2 番目の uint32-t max は何を意味し、テンプレート化された型でどのように使用されますか?
構文は次のとおりです。
template <typename T, uint32_t max>
前もって感謝します。
テンプレートの 2 番目のパラメーターです。また、テンプレート パラメーターは型である必要はありません。定数またはテンプレートにすることもできます。したがって、与えられた
template <typename T, uint32_t max> class TC {};
あなたはそれをインスタンス化します:
TC< MyClass, 42 > t;
(例) 同様に、関数テンプレートの場合:
template <typename T, uint32_t max> void tf( T (&array)[max] );
型推定を使用して、 の (数値) 値を決定できますmax
。
このような値テンプレートは、任意の型を持つことはできません。整数型か、ポインターまたは参照でなければなりません。
2 番目のパラメーターはuint32_t
型ではなく型です。たとえば、配列内の要素数を指定する場合があります。
template <typename T, uint32_t max>
struct Array
{
T data[max];
};
/* ... */
// usage example
Array<double, 10> a;
非型の値をテンプレート引数として指定できるようにするためです。
良い例はstd::array
、含まれるデータの型と配列のサイズの 2 つのテンプレート引数を持つ です。
例えば
std:array<int, 256> my_array;
値テンプレートの引数として型を使用できないことに注意してください。基本的には、ポインター、参照、および整数値に限定されます。
型、整数値、さらにはテンプレートをテンプレート パラメーターとして使用できます。これを使用する理由と方法はたくさんありますが、特定のケースでどのように機能するかを説明することは不可能です.
たとえば、配列の末尾へのポインターを返す次の関数を考えてみましょう ( std::end
C++11 の C 配列の場合と同様)。
template <typename T, size_t k>
T * end(T (& arr)[k])
{
return arr + k;
}
2 つ目は、テンプレートをインスタンス化するときに、コンパイル時に既知uint32_t max
の型の 2 番目のテンプレート引数を渡す必要があることを意味します。uint32_t