假设我有一个特定的算法可以在一系列整数上运行。然后,该函数将在此范围内使用两个迭代器并完成其工作。
template <typename It>
void doWork(It begin, It end) {
int x = *begin; // range is over integers
// ...
}
假设我有两个数据结构:
struct S { int x; }
using TupleList = std::vector<std::tuple<int, double>>;
using SList = std::vector<S>;
我想在TupleList
和SList
(单独)上使用该算法。但是,直接迭代器不能用作TupleList
,而SList
不能直接包含整数。
一种解决方案是另外向算法传递一个函子来解包迭代器:
template <typename It, typename Unwrap>
void doWork(It begin, It end, Unwrap unwrap) {
int x = unwrap(*begin);
// And so on
}
// -----
auto Sunwrapper = [](const S& s) { return s.x; }
doWork(begin(Slist), end(Slist), Sunwrapper);
但我更喜欢保持功能整洁。在C ++(加上Boost)中有没有办法从这样的unwrapper函数中自动创建迭代器?
auto unwrappedBegin = some_magical_factory(begin(Slist), Sunwrapper);
auto unwrappedEnd = some_magical_factory(end (Slist), Sunwrapper);
doWork(unwrappedBegin, unwrappedEnd);
答案 0 :(得分:2)
boost::transform_iterator
似乎是适合此的适配器。只需将some_magical_factory
替换为boost::make_transform_iterator
,包含相应的标题,它就应该有效。