1

Fusion::transformのBoost.orgのは次のとおりです。

struct triple
{
    typedef int result_type;

    int operator()(int t) const
    {
        return t * 3;
    };
};
// ...
assert(transform(make_vector(1,2,3), triple()) == make_vector(3,6,9));

しかし、私は「それを理解している」わけではありません。それらの例のベクトルには、すべて同じタイプの要素が含まれていますが、融合を使用する主なポイントは、異種タイプのコンテナーです。彼らがmake_vector(1, 'a', "howdy")代わりに使用した場合はどうなりますか?

int operator()(int t)
になる必要があります
template<typename T> T& operator()(T& const t)

しかし、どのようにresult_typeを記述しますか?template<typename T> typedef T& result_type確かに有効な構文ではありません。関数に関連付けられていないため、有効な構文であっても意味がありません。

4

2 に答える 2

5

通常、fusion :: transformは、テンプレート化された(または-上記のように-それ以外の場合はオーバーロードされた)関数演算子で使用されます。

struct triple 
{ 
    template <typename Sig>
    struct result;

    template <typename This, typename T>
    struct result<This(T)>
    {
        typedef /*...figure out return type...*/ type;
    };

    template <typename T> 
    typename result<triple(T)>::type 
    operator()(T t) const 
    { 
        return 3*t;    // relies on existing operator*() for 'T'
    }
}; 

また、Fusionに関する追加の情報源は、いくつかの手法のデモンストレーションを見つけることができる例とテストディレクトリです。

よろしくHartmut

于 2010-05-16T18:21:48.463 に答える
0

呼び出しoperator()をオーバーロードしてみましたか?

struct triple
{

    int operator()(int t) const
    {
        return t * 3;
    };
    int operator()(string t) const
    {
        return t + t + t;
    };
};
于 2010-05-16T01:41:20.100 に答える