配列の要素数を知りたいことはよくあります。残念ながらsizeof演算子では配列全体のバイト数しか取得できませんので、要素数を知るには、配列全体のバイト数を1要素のバイト数で割る必要があります。

Cでは、元ネタにある次のようなマクロを用意するのが普通です。

このマクロは優秀で、どんな配列にも適用できますし、定数式に展開されるのもポイントが高いところです。

C++でも先ほどのマクロは使えますし、マクロを使いたくない積極的な理由がなければそれで十分です。ただ、関数の引数に配列を渡したときに、その要素数を知ることができればそれはそれで便利ですので、今回はその方法を掲載しておくことにします。

このように、テンプレートを使って配列を参照渡しすれば、テンプレート引数という形で配列の要素数を取得することができます。

残念ながら、普通の関数の場合は定数式を得ることができません。ただし、C++11以降であれば、constexprを付けることで定数好きを得ることができるでしょう。

ところで、C++17からはstd::size関数が導入されました。この関数は優れもので、配列だけでなくstd::vectorなどのコンテナの要素数も取得することができます。std::size関数はconstexprが付いていますので、定数式として扱うこともできます。

使用例を掲載しておきます。

std::size関数を使うには<iterator>のインクルードを忘れないようにしてください。


元ネタ

↑ 3. 配列に関するテンプレート