読者です 読者をやめる 読者になる 読者になる

Boost.Parametersの主な用途?

C++

Boost.Accumulatorsなどを見ていると、Boost.Parametersの主な使い道はデフォルト引数をユーザーコードから名前付きで渡すことなんじゃないかと思えてきました。
たとえば、こんな再描画フラグがデフォルトfalseのdraw関数があったとして:

void draw(const Point& p, bool is_draw = false);

こういった関数で、デフォルト値以外を指定することはあまりないからこういった宣言を書くわけですが、たいていこういう関数には直値を指定するので、ユーザーコードには意味不明のbool値を指定することになってしまうことがあります。

draw(p, true); // trueってなんじゃい -> 関数宣言を見に行く

私はこういう状況ではよく、その場その場で定数に名前を付けてから渡していますが

const bool is_redraw = true;
draw(p, is_redraw);

こういったケースで、名前付き引数が適用できるんじゃないかと思います。具体的には以下のような感じです:

#include <iostream>
#include <boost/parameter/name.hpp>

BOOST_PARAMETER_NAME(is_redraw)

struct Point {
    int x, y;
    Point(int x, int y) : x(x), y(y) {}
};

void draw_impl(const Point& p, bool is_redraw)
{
    std::cout << std::boolalpha << is_redraw << std::endl;
}

void draw(const Point& p)
{
    draw_impl(p, false);
}

template <class ArgPack>
void draw(const Point& p, const ArgPack& args)
{
    draw_impl(p, args[_is_redraw]);
}

int main()
{
    draw(Point(10, 10));
    draw(Point(20, 30), _is_redraw = true);
}
false
true

直値を名前指定して渡すことができ、ユーザーコードで意図がはっきりするようになりました。
まぁでも、このケースならenumで十分な気もします。