shared_ptr
で、boostのshared_ptrなのだが。循環参照を解決できる超スマートなポインタは作れないのだろうか。まあ、簡単に作れたらboostに入っているだろうけども。
RTTIを駆使する場合を考える。例えば、
#include <iostream> class Base { public: virtual ~Base() {} } class Sub: public Base { } int main() { Base* p = new Sub(); std::cout << typeid(*p).name() << std::endl; }
の出力は「3Sub」だった(gcc3.3.3)。しかし、
#include <iostream> class Base { public: ~Base() {} } class Sub: public Base { } int main() { Base* p = new Sub(); std::cout << typeid(*p).name() << std::endl; }
の出力は「4Base」だった(同じくgcc3.3.3)。
http://ray.sakura.ne.jp/tips/rtti.htmlによるとVC++の場合には仮想関数テーブルを持つ場合はその要素として型情報を持ち、仮想関数テーブルを持たない場合は静的型から型情報を決定するらしい。gccでも似たような振舞いを見せているし、同様の機構なのだと思う。ここから推察するにRTTIは仮想関数テーブルを持つ場合にしか使えない。つまり、RTTIで超スマートポインタを作るのは無理。
実行時の型情報だけで足りないのならコンパイル時の型情報をどうにか分けてもらえば良いのではなかろうか。これには自作のプリプロセッサを通すのが簡単だが、ちょっとC++の範囲を逸脱している気がする。
一歩譲って中身の型情報が判ったとしてもその型情報からメンバの内容を割り出さなくてはならない。アーキテクチャに依存して良いなら出来ないこともなさそうな気がするがどうだろう。
結局、判らなかったということで……。