このコードは、配列のサイズを決定するように設計されたテンプレート関数 GetArrLength を定義します。
template<typename T, int size> int GetArrLength(T(&)[size]){return size;}
パラメータT(&)[size] は、型 T のサイズ size の配列への参照として宣言されています。これは、型とサイズがテンプレート パラメーターとして指定されている任意の配列への参照を受け入れることを意味します。
この関数を呼び出すと、コンパイラーはテンプレート パラメーターを推定しようとします。たとえば、次のように呼び出した場合:
int a[10]; GetArrLength(a);
コンパイラは、T が int でサイズが 10 であると判断し、10 個の整数の配列へのパラメータ参照を作成します。
この関数は、テンプレート パラメーターのサイズの値を返し、事実上、テンプレート内の要素の数を提供します。 array.
このコードは配列サイズの取得を簡素化しますが、いくつかの欠点があります。まず、テンプレート パラメーターと戻り値の両方に符号付き型を使用しますが、サイズを負にすることができないため問題があります。より堅牢な解決策を得るには、std::size_t などの符号なし型を使用する必要があります。
第 2 に、この関数の結果は、配列サイズである必要があるにもかかわらず、定数式ではありません。定数式の評価は、特定の最適化には不可欠です。
定数式の結果を提供するより高度なアプローチには、型のイントロスペクションと sizeof 演算子の使用が含まれます。
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))
この手法は、文字配列のサイズがその要素数と等しいという事実を利用します。 sizeof 演算子は、テンプレート パラメーターのサイズを表すために使用される char 配列のサイズを取得し、配列サイズの定数式評価を提供します。
以上がコンパイル時に C 配列のサイズを効率的に決定するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。