fieldの半動的追加みたいなもの in C++

なんかのクラスがあったときに、additional informationみたいなのを付けたいときがある。JavaとかC#的に書くと

class C {
    object additionalInformation;
}

みたいな感じ。additionalInformationはクラスCの中では使われず、外部が必要とする情報を格納しておくだけで、外部の人がダウンキャストして使うものとする。まーこれでも良いんだけどなんかいけてない。プログラムが大きくなってくるとクラス一つじゃ足りなくなるかもしれんし。そんじゃどうするか。

additionalInformation["key"] = value;

こんな感じにするのも考えたけど、完全に動的に追加できるようなことはしたくない。それに、これだと型もわからんし。という訳で、

additionalInformation<Key>() = value;
valueはKey::type型

struct Key {
    typedef ValueType type;
};

みたいに、ポリシーみたいなのをKeyにすることができれば、半動的に追加可能かつ静的に型付けされたものができるんじゃないかと考えた。半動的というのは、追加できるものは静的にしか決められないけど、追加自体は動的にできる(追加されないこともある)という事。これだと文字列の打ち間違えや、valueが想定してた型と違う!、名前被っちゃった!とかが無くなって、そういうのがすべてコンパイルエラーとして出てくるので少しは安全になるんじゃないかという妄想。名前の代わりに型を定義するのはめんどいかも知れないけど、上の文字列のやつでも結局どこかにそういう仕様を明記しておかないと後からだるいことになると思うので、作業量は変わらないと判断。とりあえずメリットとしては

  • 上のobjectをダウンキャストするタイプのものより柔軟
    • 不必要な情報の確保が不要
    • 局所的なものなのに広域に影響を及ぼしてしまう、というような事がない
  • mapみたいなものよりは安全
    • 上に書いたことに加え、静的に型を与えなければならないため、その情報にアクセスできる箇所が限られる(と良いなぁ)

とかがあげられるかも。デメリットとしては遅いとかださいとかSTLを使うとファイルサイズがry

でもこんなのもう誰か作ってそうだな。むしろboostにあるんじゃないかとか思ったけど探すのがめんどかったので、あったら教えてください。とりあえずtypeidを使うことになりそうなので、帰ったら聖書Modern C++ Designとboostのお力を借りようかと…。

追記(5/2):
http://www.nal.ics.es.osaka-u.ac.jp/~ykoizumi/index.php?Tips%2FPrograming%2FC%2B%2B%2Fboost%2Fgraph%2Fproperty
はい全く同じものがありました。車輪の再発明乙>俺www boostのgraph libraryは凄いなぁ…。確か本が出てたはずなので買ってもらおう。

追記2:
良く読んでみると、基本的な考え方は同じ、用途が微妙に違った。再発明までは行かずにすんだ模様。