melt日記

.NETすらまともに扱えないへたれのページ

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  111  : 記事  3  : コメント  8233  : トラックバック  41

ニュース

わんくま同盟

わんくま同盟

C# と VB.NET の質問掲示板

iKnow!


Dictation



書庫

C で固定長配列の要素数を取得するためには、

sizeof(ar) / sizeof(ar[0])

こうやって書くか、以下のように #define で定義しておいてから使ったりしていました。

#define ELEM_NUM (sizeof(ar) / sizeof((ar)[0]));

未だに上記のマクロを見かけることがあります。

 

昔から言われてますが、これらの問題点はポインタを渡しても計算出来てしまうことです。

int ar[100];
int* par = ar;
printf("%d", ELEM_NUM(par));

 

C++ なら、template という強力な武器があるので、そちらを使うべきでしょう。

template<class T, size_t N>
size_t elementof(T (&)[N])
{
    return N;
}
int ar[100];
int* par = ar;
printf("%d", elementof(ar)); // 100 が表示される
printf("%d", elementof(par)); // コンパイルエラー

template を使うと、配列の要素数が簡単に手に入ります。

固定長配列用のスタティック関数群を作ってみると面白いかもしれませんね。

投稿日時 : 2007年9月1日 14:03

コメント

# re: [C++]elementof 2007/09/01 19:36 けろ
なるほど!templateを使って、要素数をGetする方法もありますね。
(って、私、相当バカです orz)

今まで、sizeof や #define でサイズ定義してたんで、
templateを使わないと化石みたいなコードを書くはめになりますね。
参考にさせて頂きます。

# re: [C++]elementof 2007/09/01 23:28 melt
役に立ったようであれば何よりですm(__)m

# re: [C++]elementof 2007/09/02 1:07 επιστημη
シーラカンスが通りますよー♪

# re: [C++]elementof 2007/09/02 2:48 melt
えぴさんは長いこと言語と一緒なだけで、考えそのものが古いわけでは無いと思うのですがw

# re: [C++]elementof 2007/09/02 8:41 シャノン
VC++には_countofっていうマクロがあります。
実際に関数を呼び出さずに計算してくれます。

# re: [C++]elementof 2007/09/02 10:53 melt
ほえー、こんなのあるんですねー。
_countof の定義見てみたんですが、これはおもしろいw

template <typename _CountofType, size_t _SizeOfArray>
char (*__countof_helper(_CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray];
#define _countof(_Array) sizeof(*__countof_helper(_Array))

# re: [C++]elementof 2007/09/02 19:36 επιστημη
巧いなー こんなの思いつきもせぇへんわ♪


# re: [C++]elementof 2007/09/02 22:38 ながせ
これはすごいな。。いやもうboostといい勉強になります。

# re: [C++]elementof 2007/09/02 23:17 melt
boost はほんと勉強になりますよね~。
あれがある限り一生井の中の蛙にはなれそうにないですw

Post Feedback

タイトル
名前
Url:
コメント