型安全の世界
最近、boost::any、boost::shard_ptrの実装やBoost.TypeErasureの仕様書などを見て、
構造化され、ネストされた構造体や関数の中に「型安全の世界」があることにようやく気がつき始めました。
(情報科学ではこういうことを学ぶのでしょうか?)
何言ってるんだお前という感じですが・・・
どういうことかというと、
例えばshared_ptrはコンストラクタで受取った引数の型を覚えておくことができます。
がしかし、このとき受取った型を「shared_ptr」の外に伝える手段がありません。
これを「shared_ptrのcustom_deleterの中にしか型安全な世界がない」と(勝手に)表現しています。
ある値はvoid*として、何処までも外の世界(returnした後の世界=関数)に届ける事ができますが
型がわからないので、(安全に)操作することができません。
もちろんtype_infoとして出力する事ができますが、これは文字列(しかもruntime文字列)に置き変わったものです。
やはり型そのものを(戻り値型として)出力しているわけではありません。
これをキャストするには「これはこの型かもしれない」というあたりを付けてruntimeにifで分岐するしかないのです。
shared_ptrの外の世界で、コンストラクタ時に格納したオブジェクトそのものの型に自動でcastすると言う領域には達していません。
一方で、閉じた世界での型安全が保障できるということがtemplateの実現に繋がっているのもまた事実です。
それゆえにconceptベースのTypeErasureライブラリはすばらしい。
代入した時点でインターフェースを精査し、なければコンパイル時エラー。
有れば、どの世界にいてもそのconceptのインターフェースを通して、閉じた世界からのレスポンスを聞くことができるのだから。