Boost C++ Libraryのお勉強その1
Boost C++ Libraryもろくにシラネーのか。ったく何年C++で飯食ってると思ってんだ。…とか自分のboost知らなさ加減にイライラするのでお勉強。
そんなわけで連休中短期集中連載、aから始めるBoost C++ Library。都合により1.35.0で。(何でXubuntu8.10には1.37.0どころか1.36.0も入ってないんだろ?メンテナのひといそがしーのかな?)
Boost.Any
何でも代入できる型。特に事前に型指定とかしなくても代入できる。取り出しは(using namespaceすると)c++キャスト風のテンプレート関数で取り出す。
#include <iostream> #include <string> #include <boost/any.hpp> int main() { boost::any a; int i = 1; std::string s = "string"; a = i; std::cout << boost::any_cast < int > (a) << std::endl; a = s; std::cout << boost::any_cast < std::string > (a) << std::endl; return 0; }
1 string
voidポインタに突っ込むのに比べたら格段にいいけど、よーするにダウンキャストしてるわけなので、設計上の使いどころが難しそうだな。
Boost.Array
固定長配列でイテレータとかも使える。
1.35.0だと[]オペレータのインデックスをBOOST_ASSERTでチェックしてるので、デバッグとかに便利そう。
#include <iostream> #include <string> #include <numeric> #include <boost/array.hpp> int main(void) { boost::array < std::string, 3 > a; a.at(0) = "alfa"; a.at(1) = "bravo"; a.at(2) = "charlie"; std::cout << std::accumulate(a.begin(), a.end(), std::string("")) << std::endl; return 0; }
alfabravocharlie
Boost.Asio
これは大きめのライブラリで、非同期IOを扱う。非同期IOって具体的に何かと言うと、あらゆるIOを扱おうとしていて、1.35.0では取り合えずネットワーク周りでTCPとかUDPとかSSLとか。1.37.0を見たらシリアルポートとかも扱えるらしい。
移植性の面では必須な感じはするが、ネットワーク周りでも例えばSMTPクライアントとかそこまで便利なネットワーク機能はない模様。
個人的にネットワーク周りはあまり興味がないのと、10行程度でちょっと試せそうなネタが思い浮かばないので、プログラムはなし。
Boost.Assign
複数の値の代入を一行で書けるようにするもの。こういうの欲しかったんだよね。こんなの言語仕様変えないで出来るもんなんだな。C++にも世のC++プログラマにも恐れ入る。マニュアルによるとStroustrup先生の「C++の設計と進化」に関数オペレータの実用的な使い方として出てくるらしい。…が、読んだはずなのに、全然覚えてないよorz
assign.hppのインクルードとboost::assignのusing namespaceで後はそのままなんとなく使えてしまう。
#include <iostream> #include <vector> #include <numeric> #include <boost/assign.hpp> int main(void) { using namespace boost::assign; std::vector < int > v; v += 1, 2, 3, 4, 5; std::cout << std::accumulate(v.begin(), v.end(), 0) << std::endl; return 0; }
15
なんで右辺にこんなの取れるか思い浮かばなかったのでコード見たところ、「,」オペレータの多重定義してる。「,」ってオーバーロードできるんだっけ。BoostどころかC++の文法自体を理解できてないじゃんorz