17

次のコードが与えられます:

const myStr codesArr[] =  {"AA","BB", "CC"};     

myStrはラップするクラスchar*です。配列内のすべてのアイテムをループする必要がありますが、アイテムの数がわかりません。constサイズを表す値(この場合は3)を定義したくありません

次のようなものを使用しても安全ですか?

const int size = sizeof(codesArr) / sizeof(myStr);

何をすべきか?

4

3 に答える 3

36

これを行うための安全で明確な方法は、std::extent(C ++ 11以降)を使用することです。

const size_t size = std::extent<decltype(codesArr)>::value;
于 2012-11-14T09:08:03.940 に答える
19

int size = sizeof(codesArr) / sizeof(myStr);関数にパラメーターとして渡さない限り、使用できます。これは、配列がポインターに減衰し、サイズ情報が失われるためです。

テンプレートトリックを使用することもできます。

template<typename T, int sz>
int size(T(&)[sz])
{
    return sz;
}
于 2012-11-14T09:01:33.040 に答える
1

配列のサイズを取得するための最良の方法(pre c ++ 11)は、このリンクにあります。これは複雑なテンプレートトリックですが、上記のリンクで説明されているように、他のアプローチに比べて多くの利点があります。この方法は、次のマクロ+関数を使用することです。

template <typename T, size_t N>
char ( &_ArraySizeHelper( T (&array)[N] ))[N];

#define countof( array ) (sizeof( _ArraySizeHelper( array ) ))

その利点は、とりわけ、それが純粋にコンパイル時の操作であり、実行時に実行するよりも優れていることです。また、c ++ 11のconstexprの前では、操作結果を次のように使用できる唯一の方法です。別の配列のサイズコンパイル時定数以降)

于 2012-11-14T09:19:24.860 に答える