smart_ptrはスマートなポインタか?(2)

昨日のエントリに対して返答(id:okzk:20060623)が来たので回答しておきます。


■ 動的に型サイズを取得できるのか?



昨日のエントリは、ひなた先生にあった「動的な型サイズを求めることができる」というところに
ついてのツッコミであって、smart_ptrの実装とか有用性とか使用する際の注意事項とかは問題に
してないんですよー。


「動的な型サイズを求めることができる」なんて書いたかなー?と思って、元原稿を読み返すと…。


ケンイチ「それであれば、ポインタをwrapするようなtemplateクラスを作って、virtualな
operator++を定義して、動的な型のサイズを加算するようにしておけばいいのではないでしょうかね」

「動的な型のサイズを加算する」とは書いてあるけど、「動的な型のサイズを(upcastされたポインタから)動的に求めることができる」とは書いてないのだけど…。私としては「動的な型のサイズ」自体は、newするときに同時にsmart_ptrに渡してやればsmart_ptrのメンバに記録しておくことは可能だという程度の意味で、「smart_ptrのソースを見ればいいんでね?」と回答したつもりだったのだけど、どうも出発点で行き違いがあったようだ。


関連する話題としてshinichiro_hさんがid:shinichiro_h:20060623で書いている「動的に型サイズを求めるスマポ 」がある。これは、以下のような制約を課している。


仮想関数の無いクラスはたぶん使えない。
smart_ptr のコンストラクタに渡したポインタは全て同じ型。
仮想関数テーブルがクラスの先頭にある。
配列サイズは2以上。

オブジェクトの先頭には仮想関数テーブル(正しくは「仮想関数テーブルへのポインタ」のことだろう)が存在することを前提に、その仮想関数テーブルが一致するまでのオフセット値をオブジェクトサイズとしている。(多重継承をしていない限り、型が異なれば先頭にある仮想関数テーブルへのポインタも異なる) 当然、id:okzk:20060623#1151025781で指摘されているような問題があって、このへんがshinichiro_hさんがこれは「冗談」だと書かれている理由でもある。


まあ、しかし、これにしてもメンバ変数自体がゼロクリアされていることが明らかな文脈においては使えなくもないと思う。