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; }