Boost C++ Libraryのお勉強その2

Boost.Bimap

双方向マップ。どんな場合に便利なのかちょっと思い浮かばない。
テンプレート引数を単純にintとかにせず、専用の型で包んで渡すと挙動を変えられるみたいで、パッケージ全体としてはやや大きめ。

#include <iostream>
#include <boost/bimap.hpp>

int main(void)
{
    typedef boost::bimaps::bimap < int , std::string > bm_t;
    bm_t bm;

    bm.insert( bm_t::value_type(1, "charlie") );
    bm.insert( bm_t::value_type(2, "delta") );

    std::cout << bm.left.at(2) << std::endl;
    std::cout << bm.right.at("charlie") << std::endl;

    return 0;
}
delta
1

Boost.Bind

関数の一部引数を固定した関数を作ったりするもの。最初見たときにぱっとみに意味不明なのが、_1とか_2とか。これは変数でbind用に特別な動きをする。

#include <iostream>
#include <vector>
#include <algorithm>
#include <boost/bind.hpp>

void func(std::string left, std::string right)
{
    std::cout << left << " : " << right << std::endl;
}

int main(void)
{
    std::vector < std::string > v;
    v.push_back("alfa");
    v.push_back("bravo");
    std::for_each(v.begin(), v.end(), boost::bind(func, "charlie", _1));
    std::for_each(v.begin(), v.end(), boost::bind(func, _1, "delta"));
    return 0;
}
charlie : alfa
charlie : bravo
alfa : delta
bravo : delta

Boost.CRC

巡回冗長検査とか言われるやつ。

#include <iostream>
#include <boost/crc.hpp>

int main(void)
{
    char buf[] = {0, 0, 0, 0, 0};
    boost::crc_32_type crc;
    crc.process_bytes(buf, sizeof(buf));
    std::cout << std::hex << crc.checksum() << std::endl;
    return 0;
}
c622f71d

動作はしたけど正しいのかどうかはよく分からない…。

Boost.Call_Traits

関数のパラメータについてconstとか参照とかをつけるかどうか勝手に決めてくれるらしい。

#include <vector>
#include <boost/call_traits.hpp>

template < typename T > class Dummy
{
    private:
        typedef typename boost::call_traits<T>::param_type param_t;
        T data;

    public:
        void set_data(param_t p)
        {
            data = p;
        }
};

int main(void)
{
    int i;
    Dummy < int > di;
    di.set_data(i);

    std::vector < int > v;
    Dummy < std::vector < int > > dv;
    dv.set_data(v);

    return 0;
}

実際どうなったかをみてみる。

$ nm --demangle call_traits.o 
                 U _Unwind_Resume
0000000000000000 W Dummy > >::set_data(std::vector > const&)
0000000000000000 W Dummy > >::Dummy()
0000000000000000 W Dummy > >::~Dummy()
0000000000000000 W Dummy::set_data(int)

... 以下略 ...

vectorの方はconst参照になって、intの方は実体渡しになる。