ホームページ > バックエンド開発 > C++ > C テンプレート関数は配列のサイズをどのように決定するのでしょうか?

C テンプレート関数は配列のサイズをどのように決定するのでしょうか?

DDD
リリース: 2024-12-05 17:31:11
オリジナル
675 人が閲覧しました

How Does a C   Template Function Determine the Size of an Array?

「配列のサイズ」テンプレート関数を理解する

このコードは、テンプレート関数を使用して配列の長さを決定しますが、その内部仕組みは謎めいている可能性があります。このタスクをどのように実行するかを詳しく見てみましょう。

パラメータの謎解き

関数パラメータ 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(&amp;)[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&amp; sizeof_array_helper(T(&amp;)[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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート