boost::parameter

#include <boost/parameter.hpp>
#include <boost/tuple/tuple.hpp>
#include <boost/tuple/tuple_comparison.hpp>
#include <boost/assert.hpp>


typedef boost::tuple<int, int> pos_t;

BOOST_PARAMETER_NAME(x)
BOOST_PARAMETER_NAME(y)

template<typename Args>
pos_t
make_pos(const Args& args){
    return pos_t(args[_x], args[_y]);
}

// こういう書き方も出来る
BOOST_PARAMETER_FUNCTION(
    (pos_t), make_pos2, tag,
    (required
        (x, (int))
        (y, (int))
    )
){
    return pos_t(x, y);
}

int
main(){
    
    // 二重括弧になっているのに注意
    pos_t p1 = make_pos((_x = 0, _y = 3));
    pos_t p2 = make_pos((_y = 3, _x = 0));

    BOOST_ASSERT( p1 == p2 );
    
    BOOST_ASSERT(make_pos2(_x = 10, _y = 3) == make_pos2(_y = 3, _x = 10) );
    
    return 0;
}


関数の引数を順番ではなくて、名前で指定する事が出来るライブラリです。
その名のとおり、複数のパラメータを引数に取る関数を定義する場合に便利そうですね。
引数のデフォルト値も定義することが出来るので結構いろいろとできそうです。
BOOST_PARAMETER_FUNCTION を使った関数の定義は別の言語に見えます……。


[boost]
ver 1.44.0
[参照]
http://www.kmonos.net/alang/boost/classes/parameter.html