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