C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 -> C++23 と更新されています。
なかでも C++11 での更新は非常に大きなものであり、これから C++ の学習を始めるのなら、C++11 よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。
配列が定義されているとして、実行時に、その配列の要素数を知るにはどうすればいいでしょうか。
たとえば、以下のようなプログラムがあるとき、
#include <iostream>
int main()
{
int array1[10];
int array2[] = {0, 1, 2, 3, 4};
std::cout << /**/ << std::endl;
std::cout << /**/ << std::endl;
}
標準出力へ、10 と 5 が出力されるようにしたいとします。
C言語でも使える方法です。C言語編の逆引きで解説しているので、詳細はそちらを参照してください。
#include <iostream>
#define SIZE_OF_ARRAY(array) (sizeof(array)/sizeof(array[0]))
int main()
{
int array1[10];
int array2[] = {0, 1, 2, 3, 4};
std::cout << SIZE_OF_ARRAY(array1) << std::endl;
std::cout << SIZE_OF_ARRAY(array2) << std::endl;
}
実行結果:
10
5
方法①では、マクロを使っていますが、C++ には、マクロを使わずに済ませる方法があれば、できるだけ避けるようにしましょう。
関数テンプレート📘(【言語解説】第9章)を使って、次のようにできます。
#include <iostream>
namespace {
template <typename T, std::size_t N>
inline std::size_t sizeOfArray(const T (&)[N])
{
return N;
}
}
int main()
{
int array1[10];
int array2[] = {0, 1, 2, 3, 4};
std::cout << sizeOfArray(array1) << std::endl;
std::cout << sizeOfArray(array2) << std::endl;
}
実行結果:
10
5
sizeOfArray関数テンプレートの引数は、要素数が N の T型配列の const参照です。渡されてきた配列を、関数テンプレート内で使うことはないので、引数名を省略していますが、省略せずに書くなら、次のようになります。
template <typename T, std::size_t N>
inline std::size_t sizeOfArray(const T (& array)[N]);
関数テンプレートは、呼出し時の実引数から、テンプレート実引数を推測してくれるため、使う側としては非常に簡単です。このテンプレート実引数の推測の際に、要素数も判断されることを利用しています。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
![]() |
管理者情報 | プライバシーポリシー |