サンプルの動作確認バージョン [GCC4.4/1.41.0] [VC9/1.41.0]
#include <iostream>
#include <iomanip>
#include <string>
#include <boost/parameter.hpp>
using namespace std;
using namespace boost::parameter;
// 引数名の定義
BOOST_PARAMETER_NAME(x)
BOOST_PARAMETER_NAME(y)
BOOST_PARAMETER_NAME(msg)
BOOST_PARAMETER_NAME(width)
// 関数の定義
BOOST_PARAMETER_FUNCTION(
(void), draw_text, tag, // 返値型, 関数名, タグ名前空間(通常はtagと書けばOk)
(required // 必須の引数
(x, (int))
(y, (int))
(msg, *))
(optional
(width, (int), 4))
)
{
// 関数本体は普通に
cout << "(" << setw(width) << x << "," << setw(width) << y << ") : " << msg << endl;
}
int main()
{
string www = "World";
// 引数を名前で指定。_widthは省略できる
draw_text( _x=1, _y=2, _msg="Hello" );
// 順番変わってもOK。あとmsgの型はなんでもOK
draw_text( _msg=www, _x=3, _y=4, _width=8 );
// 必須引数は普通に引数の順番で指定もできる
draw_text( 5, 6, "GoodBye", _width=2 );
}
( 1, 2) : Hello
( 3, 4) : World
( 5, 6) : GoodBye
関数を呼び出すときの引数を、引数の順番ではなくて名前で指定できるようにしたりするライブラリです。 正確に言うと、BOOST_PARAMETER_FUNCTION というマクロを使って関数を定義すると、 そういう不思議な関数が定義できます。
BOOST_PARAMETER_FUNCTION の書式は、上のサンプルでなんとなく伝わるのではないでしょうか…。 必須引数はrequiredの中に、オプションの引数はoptionalの中にデフォルト値付きで書きます。 引数の型は、括弧して普通に型を書くか、なんでもいいときは * と書く(この場合、 実装的にはその引数型がテンプレート引数になります)か、*(MPLのbool式)という形で、 引数の条件をメタプログラムで記述したりもできます。
他に、関数引数だけでなくテンプレート引数も名前付きにできたり、色々な機能がもりだくさんです。