2004-08-05

boost::any  [by miyachi]

プログラマの日記とか書きながら[プログラミング]カテゴリーの投稿が1つも無かった。いかんいかんと言う事で初投稿をば。

C++で色々な機能を持つクラス群を管理するクラスを書いていた。共通な項目は管理クラスに書いて実際の機能クラスへのポインタを管理して、管理クラス自体はstd::vectorで管理して…と考えた。テンプレートを使えば管理クラスで各種機能クラスへのポインタを持たせる事は簡単だが、テンプレートでは使用時に確定してしまうので同じvectorでは管理出来ない事に気付く。

う~むどうしたものか…機能クラスへのポインタはvoidポインタにしてしまおうか…でもそれではあまりにもあんまり。と言う事でokaさんに相談してみた。なんかboostでそんな機能があったような…と調べてくれたのがboost::anyでした。例えば、

static char* hw = "hello world.";
boost::any a, b;
a = 100; // 整数を入れる
b = hw; // 文字列を入れる
a = b; // any同士の代入
b = Point(10,20); // ユーザー定義型でも入っちゃう

と何でも入ってしまう、さすがエニー。なおPointはユーザ定義の型。これを使う時には例えば、

Point c = boost::any_cast<Point>(b);

とany_castを使ってキャストすれば良い。う~ん便利!しかも失敗するとちゃんと例外も投げてくれる。このboost::anyを使って目的のクラスの実装は無事完了したのでした。自分でも似たような物は作れなくも無い気がするが、こちらの方がエレガントで使い易い。作者様に感謝しつつ使わせて頂きます。
2004-08-05 12:28:01 - miyachi - - [プログラミング] -