「配列のサイズ」テンプレート関数を理解する
このコードは、テンプレート関数を使用して配列の長さを決定しますが、その内部仕組みは謎めいている可能性があります。このタスクをどのように実行するかを詳しく見てみましょう。
パラメータの謎解き
関数パラメータ T(&)[size] は、最初は複雑に思えるかもしれません。これを裏返しにデコードすると、型 T のサイズ size の名前のない配列への参照が明らかになります。これは、配列の型とサイズがテンプレート パラメーターで指定される任意の配列への参照を受け入れることを意味します。
テンプレート推定の動作
関数が配列を使用して呼び出された場合、次のようになります。 as:
int a[10]; GetArrLength(a);
コンパイラはテンプレート パラメータを推論しようとします。パラメーターの型を一致させるには、T は int で、size は 10 である必要があります (その結果、パラメーターは 10 個の整数の配列を参照します)。次に、関数はサイズを返し、配列内の要素の数を提供します。
潜在的な問題への対処
このコードには 2 つの潜在的な問題があります。まず、サイズを負にすることはできないため、テンプレート パラメーターまたは戻り値の型に符号付き型を使用しないでください。代わりに、std::size_t:
template<typename T, std::size_t Size> std::size_t GetArrLength(T(&)[Size]) { return size; }
などの符号なし型を使用する必要があります。第 2 に、配列サイズの定数の性質にもかかわらず、関数の結果は定数式ではありません。使いやすさを高めるには、定数式を使用することをお勧めします:
template <std::size_t N> struct type_of_size { typedef char type[N]; }; template <typename T, std::size_t Size> typename type_of_size<Size>::type& sizeof_array_helper(T(&)[Size]); #define sizeof_array(pArray) sizeof(sizeof_array_helper(pArray))
この手法を使用すると、配列のサイズを定数式として取得できます:
int a[10]; const std::size_t n = sizeof_array(a); // constant-expression!
以上がC テンプレート関数は配列のサイズをどのように決定するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。