ホームページ  >  記事  >  バックエンド開発  >  C テンプレート関数を使用して配列のサイズを取得するにはどうすればよいですか?

C テンプレート関数を使用して配列のサイズを取得するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-21 14:40:11136ブラウズ

How Can I Get the Size of an Array Using a C   Template Function?

この「配列のサイズ」テンプレート関数はどのように機能しますか?

このテンプレート関数 GetArrLength は、配列の長さを決定するように設計されています。これは、それぞれ T 型と int サイズのテンプレート パラメーターとして設定された配列のサイズと型の知識を活用することでこれを実現します。

この関数は、型 T とサイズ size の配列への参照を次のように受け取ります。入力パラメータ。この参照は、構文 T(&)[size] を使用して宣言されます。これは、パラメータが size の定数を持つ型 T の配列への参照であることを意味します。

呼び出されると、コンパイラは次のことを試みます。渡される配列の型とサイズに基づいてテンプレート パラメーターを推測します。たとえば、サイズ 10 の a という名前の整数の配列を指定して GetArrLength を呼び出すと、コンパイラーは次のように推論します。 T は int で、size は 10 で、関数は値 10 を返します。

ただし、GetArrLength 関数の実装には特定の制限があります。まず、テンプレート パラメーターと戻り値の型に符号付き整数を使用すると、負の配列サイズに関する問題が発生する可能性があります。実用的な目的では、予期しない動作を避けるために、テンプレート パラメーターと戻り値の型の両方に std::size_t などの符号なし型を使用することをお勧めします。

また、関数の結果は定数式ではありません。ただし、配列のサイズは本質的に一定です。この制限に対処するために、次のコード ブロックのような定数の結果を提供できる、より堅牢なソリューションが存在します。

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))

この手法は、配列のサイズを型のサイズにエンコードすることによって定数の結果を生成します。テンプレート メタプログラミング アプローチ。これにより、結果が動的に評価されず、定数式のままになります。

以上がC テンプレート関数を使用して配列のサイズを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。