メンバメソッドにスコープ限定されたメンバ変数
以前、あるメンバメソッド内にスコープ限定させたメンバ変数を持つ手段がC++には無いという話を書きました。
やねうらおさんが掲示板で、member宣言というアイデアを出していて「これ面白いな〜」と思っていたのですが、よく考えたら自分が感じていた不満をどんぴしゃで解消してくれるアイデアだったのでした(笑)。以下に引用します。
http://yaneurao.zive.net/yanebbs/dobbsr.cgi?a=view&topic_id=1050560637&res_id=160-161
C++で書いていると、debug時など、ときどきstatic変数を使うことがある。 static変数は、その場で初期化が書ける、永続的な(シリアライズとかで 言う永続性ではなく、アプリ起動から終了まで存在しているという程度の意味) 宣言だからだ。 逆に、static変数でない、メンバ変数の何が不便かというと、 1.宣言を、クラスメンバとしてヘッダで行ない 2.初期化をコンストラクタなり何なりで記述し 3.そして使う という、3つがそれぞれ分散してしまうことにある。確かに非常に不便だ。 保守性も悪い。1箇所でしか使わない変数をメンバ変数にすると、上の 1〜3が必要になる。そりゃ、何とも不便だ。 つまり、欲しいのは、 void foo(){ member int i=0; と書けば、これをメンバ変数宣言されて、 コンストラクタでi=0が行なわれるような記法なのだ。 さらに言えば、このメンバ変数は他の場所で宣言されているiとは別になっているほうが好ましいので、 この変数名iは何かしらmanglingされた変数名と置き換わる。 そういうのを考えれば、実はC/C++のstatic変数というのは、 このmember宣言子に要求される要件をほぼ満たしていることが わかる。 だから、static変数を使いたくなる衝動というのは、十分理解できる のだ。
これほすい〜。ちなみにやねうらおさんはこの後、ゲームソフトのように、yieldを使いたいがマイクロスレッドごとのスタック生成コストが馬鹿にならないプログラムの場合、このmember宣言のアイデアが威力を持つと言っています。