My attempt without lambdas:
#include <iostream>
#include <vector>
#include <numeric>
#include <cassert>
template<class CONT>
class IterPair {
public:
using T = typename CONT::value_type;
using ITER = typename CONT::const_iterator;
IterPair(ITER it1, ITER it2) : it1_(it1), it2_(it2) {
}
std::pair<const T&, const T&> operator*() const {
return std::pair<const T&, const T&>(*it1_, *it2_);
}
bool operator!=(const IterPair& b) {
return it1_ != b.it1_ && it2_ != b.it2_;
}
void operator++() {
++it1_;
++it2_;
}
private:
ITER it1_, it2_;
};
template<class CONT>
class AdjacentIterWrapper {
public:
using const_iterator = IterPair<CONT>;
AdjacentIterWrapper(const CONT& c) : c_(c) {
assert(!c.empty());
}
const_iterator begin() {
return const_iterator(c_.begin(), c_.begin()+1);
}
const_iterator end() {
return const_iterator(c_.end(), c_.end());
}
private:
const CONT& c_;
};
template<class CONT>
AdjacentIterWrapper<CONT> IterateAdjacent(const CONT& c) {
return AdjacentIterWrapper<CONT>(c);
}
int main() {
std::vector<float> v(100);
std::iota(v.begin(), v.end(), 0.0f);
for (auto x: IterateAdjacent(v)) {
// here I do something with (*l) and (*c)
std::cout << "do something with " << x.first << " and " << x.second <<
"\n";
}
}