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