运行时和融合序列之间的相互作

时间:2011-08-11 13:16:59

标签: c++ boost-fusion

继我的问题C++ Tuple of Boost.Range - get Tuple of element types?

之后

我有以下内容:

TupleOfRanges ranges; 
TupleOfElements elements;

std::vector<int> offsets;

所有容器(meta和runtime)的大小为N。我想编写执行以下操作的代码:

boost::fusion::at_c<0>(elements) 
    = *(boost::begin(boost::fusion::at_c<0>(ranges)) + offset[0]);
boost::fusion::at_c<1>(elements) 
    = *(boost::begin(boost::fusion::at_c<1>(ranges)) + offset[1]);
// ...
boost::fusion::at_c<N>(elements) 
    = *(boost::begin(boost::fusion::at_c<N>(ranges)) + offset[N]);

我尝试使用Fusion的transform操作来编写这个,但问题似乎是仿函数不知道它正在运行的元素的索引。

我认为这样的事情:

elements 
    = boost::fusion::transform(boost::fusion::zip(ranges, indices), getValue);
如果我能以某种方式制作包含indices

的融合序列int 0...N

可能会有效

那么有人可以帮我制作一个提升序列,或找到更好的方法来实现我的目标吗?非常感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用boost::mpl::range_c获取一系列递增的非类型模板参数。您需要将此序列复制到另一个mpl :: sequence,因为范围不满足与transform一起使用的所有必要概念要求。序列可以使用fusion进行调整。