Boost.Functional/OverloadedFunction を試してみた

以前から気になっていたんですがやっと試してみました。
OverloadedFunction を使用すれば複数の関数を1つの関数オブジェクトにまとめる事ができます。

[ソース]

#include <boost/functional/overloaded_function.hpp>
#include <boost/lexical_cast.hpp>
#include <string>
#include <iostream>


std::string
to_string(int n){
    return boost::lexical_cast<std::string>(n);
}

int
to_int(std::string str){
    return boost::lexical_cast<int>(str);
}


int
main(){
    // 複数の関数を1つの関数オブジェクトにまとめる
    boost::overloaded_function<
        std::string(int),
        int(std::string)
    > multi(&to_string, &to_int);

    // 多重定義関数のように引数の型によって呼び出す関数を決める
    std::cout << multi(10) + "-mami" << std::endl;
    std::cout << multi("42") * 2 << std::endl;

    return 0;
}

[出力]

10-mami
84


以前、似たようなコードを書いたのですが、Boost にもあったんですね。
ただ、関数の型とかを書くのがちょっとめんどくさい。
C++03 ならしょうがない気がするけども。