1

Boost.org给出的 fusion::transform示例如下:

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 的其他信息来源是示例和测试目录,您可以在其中找到一些技术的演示。

问候哈特穆特

于 2010-05-16T18:21:48.463 回答
0

您是否尝试过重载调用运算符()?

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 回答