配列の要素数を知りたいことはよくあります。残念ながらsizeof演算子では配列全体のバイト数しか取得できませんので、要素数を知るには、配列全体のバイト数を1要素のバイト数で割る必要があります。
Cでは、元ネタにある次のようなマクロを用意するのが普通です。
0 1 2 |
#define ArraySizeOf(array) (sizeof(array) / sizeof(array[0])) |
このマクロは優秀で、どんな配列にも適用できますし、定数式に展開されるのもポイントが高いところです。
C++でも先ほどのマクロは使えますし、マクロを使いたくない積極的な理由がなければそれで十分です。ただ、関数の引数に配列を渡したときに、その要素数を知ることができればそれはそれで便利ですので、今回はその方法を掲載しておくことにします。
0 1 2 3 4 5 6 |
template <typename T, std::size_t N> std::size_t count_of(T (&array)[N]) { return N; } |
このように、テンプレートを使って配列を参照渡しすれば、テンプレート引数という形で配列の要素数を取得することができます。
残念ながら、普通の関数の場合は定数式を得ることができません。ただし、C++11以降であれば、constexprを付けることで定数好きを得ることができるでしょう。
ところで、C++17からはstd::size関数が導入されました。この関数は優れもので、配列だけでなくstd::vectorなどのコンテナの要素数も取得することができます。std::size関数はconstexprが付いていますので、定数式として扱うこともできます。
使用例を掲載しておきます。
0 1 2 3 4 5 6 7 8 9 |
#include <iostream> #include <iterator> int main() { int array[10]; std::cout << std::size(array) << std::endl; } |
std::size関数を使うには<iterator>のインクルードを忘れないようにしてください。