named params

*以下のコードで利用している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多用してるので,何やってるか追うには時間かかりそうだからやめておこうっと.
#当然,通常の関数呼び出しにも対応していると・・・