3

boost::fusion::vector のすべての要素に対して関数を呼び出したいと思います。要素は次のようなタイプです。

class A {
    ...
    void print_with_prefix(const char *prefix) {
        std::cout << prefix << *this;
    }
};

この関数は、次の方法で各要素に対して呼び出すことができます。

// Call print_with_prefix() on a boost::fusion sequence:

struct CallPrintWithPrefix {
    const char *prefix_;
    CallPrintWithPrefix(const char *prefix) : prefix_(prefix) {}
    template <class T> void operator()(T &element) const {
        element.print_with_prefix(prefix);
    }
}

template <class BoostFusionVector>
void print_all(BoostFusionVector &v, const char *prefix) {
    boost::fusion::for_each(v, CallPrintWithPrefix(prefix));
}

ただし、print_all()ヘルパー クラスを含めるこの実装はかなり見苦しく、複雑すぎるようです。C++0x が許可されていると仮定すると、それを実装する正しい方法は何ですか?

4

1 に答える 1

3

あなたがしたことは正しい方法です。たとえば、ラムダ式は多態的ではないため、C++0xはその点であまり役に立ちません。そのため、1日の終わりにどこかにテンプレートを記述する必要があります(残念ながら、C++でも名前空間スコープにある必要があります)。 0x) operator()、.

ただし、Boost.Phoenix などの一部のライブラリでは、ポリモーフィック ファンクターをオンザフライで作成できます。たとえばref(std::cout) << arg1、任意の種類の引数を に渡すことができるオブジェクトを作成しますstd::cout。メンバー関数を呼び出しているため、あなたの場合は役に立ちません。

これについて言及するのは今日で 2 回目ですがmake_overload、オーバーロードされたファンクターをオンザフライで作成できる機能があります。要素タイプのセットが小さく、変更される可能性が低い場合に役立ちます。たとえば、そのような型が 2 つしかないと仮定すると、次のようAになりBます。

auto overload = make_overload(
    [prefix](A& a)
    { a.print_with_prefix(prefix); }
    , [prefix](B& c)
    { b.print_with_prefix(prefix); } );
boost::fusion::for_each(v, overload);
于 2011-07-29T08:45:02.030 に答える