如何在异构容器上使用boost :: fusion :: transform?

时间:2010-05-15 23:05:36

标签: c++ boost boost-fusion

Boost.org为fusion :: transform提供的example如下:

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当然不是有效的语法,即使它是有意义的也没有意义,因为它与函数无关。

2 个答案:

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

关心哈特穆特

答案 1 :(得分:0)

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

struct triple
{

    int operator()(int t) const
    {
        return t * 3;
    };
    int operator()(string t) const
    {
        return t + t + t;
    };
};