Jump to navigation
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を使って目的のクラスの実装は無事完了したのでした。自分でも似たような物は作れなくも無い気がするが、こちらの方がエレガントで使い易い。作者様に感謝しつつ使わせて頂きます。
コメント一覧
STL、boost、WTLなど新しい(?)のライブラリや技術を使おうとすると嫌な顔をされて、具体的な理由もなく反対されるのですが、説得するにどんな言葉が効果的でしょう?
nobくん、こんにちは。
う~ん具体的な理由が無い反対ってのは難しいなぁ。それって単に保守的だったり新しい物への拒否反応、つまり食わず嫌いだと思うんだけど。おそらく拒否している人はまずC++をちゃんと使いこなせていない(例:テンプレートが理解できていない)のでは無いかと思う。私も最近までそうだったのでその辺りは良く判るのだが…
CとC++って似ていて異なる言語だと思うんだけど、それをきちんと認識して貰う事から始めないとダメかもしれませんね。例えば「Effective C++」辺りの本をベースに、C++のお約束を決めて行くのも良いかも。C++が理解できてテンプレート等の機能が使えるようになれば、STLやboostの良さも理解できると思う。
後は正攻法ではやはりSTL/boost/WTL等でどれだけ生産性が上がるかを納得して貰うように努力するくらいかな。少なくとも最近のC++の処理系だとどちらも標準に近いかたちで使える点もアピールするとか。
C++のプログラミングが「出来る」プログラマって実際にはまだまだ少ないのかもと思う今日この頃でした。って私だってまだ「出来る」とは言えない修行中の身だったりしますが(笑)
Okaです。nobさん、こんにちは。
さすがに Mozilla のテクノロジをバリバリに使われたりすると、「ちょっとかんべん」と思ったりもするけど、今どき、stl や boost は使って当然の技術でしょう。というか、実際、使わないと生産性が上がらないと思うんですが。
たとえば今日も「複数のレジストリからキーの一覧を取得して、マージした上で重複を除去する」なんてコードを書いたんですが、とりあえず、重複も含めていったん vector に格納してしまえば、あとは、
std::sort(vec.begin(), vec.end());
std::unique(vec.begin(), vec.end());
の2行で終わりですからね。生産性が1ケタは違います。やはり、そこを主張するしかないのでは。
はじめまして、okaさん。
ご意見ありがとうございます。
生産性を主張して、がんばってみます。
「自分は少数派で、その他大勢と同じようにしておいた方がいいのでは…」という危惧から積極的になれずにいましたが、背中を押された気分です。
夏休み明けで今日から仕事ですが、気分よく始められそうです。
コメントを書く