次のコードが与えられます:
const myStr codesArr[] = {"AA","BB", "CC"};
myStrはラップするクラスchar*です。配列内のすべてのアイテムをループする必要がありますが、アイテムの数がわかりません。constサイズを表す値(この場合は3)を定義したくありません
次のようなものを使用しても安全ですか?
const int size = sizeof(codesArr) / sizeof(myStr);
何をすべきか?
これを行うための安全で明確な方法は、std::extent(C ++ 11以降)を使用することです。
const size_t size = std::extent<decltype(codesArr)>::value;
int size = sizeof(codesArr) / sizeof(myStr);関数にパラメーターとして渡さない限り、使用できます。これは、配列がポインターに減衰し、サイズ情報が失われるためです。
テンプレートトリックを使用することもできます。
template<typename T, int sz>
int size(T(&)[sz])
{
return sz;
}
配列のサイズを取得するための最良の方法(pre c ++ 11)は、このリンクにあります。これは複雑なテンプレートトリックですが、上記のリンクで説明されているように、他のアプローチに比べて多くの利点があります。この方法は、次のマクロ+関数を使用することです。
template <typename T, size_t N>
char ( &_ArraySizeHelper( T (&array)[N] ))[N];
#define countof( array ) (sizeof( _ArraySizeHelper( array ) ))
その利点は、とりわけ、それが純粋にコンパイル時の操作であり、実行時に実行するよりも優れていることです。また、c ++ 11のconstexprの前では、操作の結果を次のように使用できる唯一の方法です。別の配列のサイズ(コンパイル時定数以降)