まぁ僕の好みはサイズ入りのクラスを作ることなんですが、
やんごとなき理由からレガシーなPOD配列使いたいこともあろうと思い、
ちょっとやってみた次第である。
#コード
template<typename TYPE, std::size_t N> std::size_t numof(const TYPE (&)[N]){
return N;
}
#使い方
int test[16];
double test2[8];
float test3[4];
int test4;
myClass test5[256];
std::cout << numof(test) << std::endl;
//16
std::cout << numof(test2) << std::endl;
//8
std::cout << numof(test3) << std::endl;
//4
std::cout << numof(test4) << std::endl;
//コンパイルエラー!
std::cout << numof(test5) << std::endl;
//256
受け取っているのはただのリファレンスなので、重たい配列に適用させてもコピーが起こらないので安心。
しかしまぁ、それにしてもC++はこれくらい標準で入れといてくれても良かったのに、
とか思わないこともない。。。
#2014/05/31追記
(コメント欄xeno1991さんありがとうございます。)
動的配列を入れるとどうなるでしょう?
コンパイルエラーで落ちます。
残念ながら、動的配列の要素数を得る手法は(僕の知ってる限りでは)ありません。
std::vectorを使えということだろうか…うーん。