*以下のコードで利用しているnamed paramsはboost-sandboxにあるものです.現在のboostのリリースには含まれていませんのであしからず.気になる方はドキュメントなりコードなりをsand-boxのCVS引っ張ってくるなりして入手してください.
#include <boost/named_params.hpp> struct name_t; // tag types struct value_t; namespace { boost::keyword<name_t> name; // keyword objects boost::keyword<value_t> value; } struct foo_keywords : boost::keywords< name_t , value_t > {}; BOOST_NAMED_PARAMS_FUN(void, foo, 0, 2, foo_keywords) { std::cout << p[name | "unnamed"] << " = " << p[value | 0] << "\n"; } foo(name = "pi", value = 3.14); // pi = 3.14 foo(value = 2.718, name = "e"); // e = 2.718 foo(name = "zero"); // zero = 0 foo(value = 0.577); // unnamed = 0.577 foo(); // unnamed = 0 //普通の関数呼び出しもOK(引数の順序はboost::keywordのテンプレート引数の順番と一致) foo("pi", 3.14); // pi = 3.14 foo("zero"); // zero = 0
気になったのでBoost::NamedParams覗いてみたけれど,相も変わらず予想のはるか斜め上逝ってくれてるよ・・・.デフォルト値の指定がor演算子って・・・.
実装の方はpreprocessor多用してるので,何やってるか追うには時間かかりそうだからやめておこうっと.
#当然,通常の関数呼び出しにも対応していると・・・