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

Kyl*_*yle 1 c++ boost boost-fusion

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));
Run Code Online (Sandbox Code Playgroud)

然而,我并没有"得到它".它们的示例中的向量包含所有相同类型的元素,但使用融合的主要点是异构类型的容器.如果他们使用了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当然不是有效的语法,即使它是没有意义的,因为它不依赖于函数.

hka*_*ser 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'
    }
}; 
Run Code Online (Sandbox Code Playgroud)

而且,有关Fusion的其他信息来源是示例和测试目录,您可以在其中找到某些技术的演示.

关心哈特穆特