はみ出しRAPTの戯言

- a day after yesterday -

目次

Blog 利用状況

ニュース

書庫

日記カテゴリ

コミュニティ リンク

わんくま大阪勉強会#6

これで参加2回目となるわんくま勉強会に参加しました。
今回はεπιστημηさん大阪降臨祭ということで、濃いネタに触れてきました。

επιστημηさんとは、数年前から某C/C++系掲示板にて
お見かけしていたが、実際に会ったのは今回が初めて。

その後の懇親会では、以前から聞いてみたかった C++ の仕様
について「なんで?」の疑問を投げかけることができました。

Q1.静的配列のサイズを取得する演算子が欲しい。
const int values[] = { 1, 3, 5, 7, 9 };
とあったとき、values に含まれる要素数を取得したいときがある。

こういった場合、常套手段として、sizeof 演算子を使う。
#define countof( arr ) ( sizeof( arr ) / sizeof( arr[ 0 ] ) )
とかしておけば、countof( values ) で要素数 5 が取得できる。
しかも、コンパイル時に求まるので、定数扱いになる。

A1.「vector を使え」というのが標準化委員会の答え。
vector< int > v;
v.push( 1 );
v.push( 3 );
v.size(); // 2

でもこれだと、const オブジェクトの初期化ができない。具体的には、
const vector< int > v = { 1, 3, 5, 7, 9 };
みたいなことができればいいのだが、今はそれができない。

だがしかし、将来の拡張でこれができるよう動いているとのこと!

投稿日時 : 2007年2月11日 4:44

コメントを追加

# re: わんくま大阪勉強会#6 2007/02/11 21:08 シャノン

templateを使え、というテもある。
VC++ 2005 の stdlib.h にある(あったと思う)_countof マクロを探してみよう。
このマクロのカラクリがすんなり読めたらC++通。

# re: わんくま大阪勉強会#6 2007/02/11 21:52 RAPT

手元には VC6 と VC.NET2003 しかないので。。
VC2005 に触れる機会があったら見てみたいと思います。

# re: わんくま大阪勉強会#6 2007/02/13 10:04 シャノン

じゃあ書いちゃおう。こんなの。

template <typename _CountofType, size_t _SizeOfArray>
char (*__countof_helper(UNALIGNED _CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray];

#define _countof(_Array) sizeof(*__countof_helper(_Array))

# re: わんくま大阪勉強会#6 2007/02/14 2:45 RAPT

うわぁ~、何てトリッキーな・・・
解釈するのに小一時間かかりましたorz

_CountofType [_SizeOfArray] の参照を引数にとり、
(この時点で、_Array の型と要素数を知る)
char [_SizeOfArray] へのポインタを返す関数の宣言に対し、
(char は 1byte なので _SizeOfArray がそのまま知りたい数値)
間接参照で sizeof すると、_SizeOfArray が取れる、か。

しかも template なので、きちんとコンパイル時にサイズも取れる。
ただし、無論、静的配列のみ、ってことになりますね。

うわぁー、すげー。

# re: わんくま大阪勉強会#6 2007/02/14 10:33 シャノン

> Q1.静的配列のサイズを取得する演算子が欲しい。
というQに対して
> A1.「vector を使え」というのが標準化委員会の答え。
というAは答えになってないというか…「静的配列なんぞ使うな」という方が正しいよなぁ。

# re: わんくま大阪勉強会#6 2007/02/15 3:19 RAPT

さきの template 確かにすごいけど、なぜに
#define _countof( _Array ) ( sizeof( _Array ) / sizeof( _Array[ 0 ] ) )
じゃだめな理由が・・・あ、もしかして、要素数 0 を考慮したってことかな?

タイトル
名前
URL
コメント