読者です 読者をやめる 読者になる 読者になる

配列長の取得の仕方

cで配列長を取得するときには、しばしば、

#define GET_ARRAY_LENGTH(array) sizeof(array) / sizeof(array[0])
cout << GET_ARRAY_LENGTH(array) << endl; // -> 100

などとします。
このマクロは固定長配列にしか使えないのですが、ついつい以下のようなコードを書いてしまいがちです。

int* array = new int[100];
cout << GET_ARRAY_LENGTH(array) << endl;//-> 1

これは、コンパイルが通ってしまいます。

テンプレートを利用した、以下のような関数を使えば、コンパイル時にエラーを出してくれます。

#include <iostream>
using namespace std;

template<class T, size_t S>
size_t getArrayLength(const T (&array)[S]){
	return S;
}

int main(){
	int array1[100];
	cout << getArrayLength(array1) << endl;//OK

	int *array2;
	array2 = new int[100];
	cout << getArrayLength(array2) << endl;//コンパイルエラー

	return 0;
}