【发布时间】:2018-05-03 08:49:40
【问题描述】:
如果我有一个范围并且我想转换相邻的对,是否有提升 范围适配器来做到这一点?
例如
std::vector<int> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
auto b = a
| boost::range::transformed([](int x, int y){return x+y;});
输出将是
3, 5
编辑
我已尝试使用范围适配器
// Base class for holders
template< class T >
struct holder
{
T val;
holder( T t ) : val(t)
{ }
};
// Transform Adjacent
template <typename BinaryFunction> struct transformed_adjacent_holder
: holder
{
transformed_adjacent_holder(BinaryFunction fn) : holder<BinaryFunction>(fn)
};
template <typename BinaryFunction> transform_adjacent
(BinaryFunction fn)
{ return transformed_adjacent_holder<BinaryFunction>(fn); }
template< class InputRng, typename BinFunc>
inline auto Foo(const InputRng& r, const transformed_adjacent_holder<BinFunc> & f)
-> boost::any_range
< std::result_of(BinFunc)
, boost::forward_traversal_tag
, int
, std::ptrdiff_t
>
{
typedef boost::range_value<InputRng>::type T;
T previous;
auto unary = [&](T const & t) {auto tmp = f.val(previous, t); previous = t; return tmp; };
return r | transformed(unary);
}
但是我不知道如何推断 | 运算符的返回类型。如果我能做到这一点,那么适配器几乎解决了。
【问题讨论】:
-
没有
boost::range::adjacent_differenced,类似于std::adjacent_difference,就像有boost::range::transformed(类似于std::transform)
标签: c++ boost boost-range