#include #include #include #include template class NumIterator : public boost::iterator_facade < NumIterator, const T, boost::forward_traversal_tag > { public: NumIterator(T value): val_( value ) {} NumIterator(const NumIterator &) = default; private: friend class boost::iterator_core_access; void increment() { ++val_; } bool equal(const NumIterator & itr) const { return val_ == itr.val_; } T dereference() const { return val_; } T val_; }; using AnyIntRange = boost::any_range < int, boost::forward_traversal_tag, int, std::ptrdiff_t >; int main() { auto nrange_filt = boost::make_iterator_range(NumIterator(10), NumIterator(20)) | boost::adaptors::filtered([](const int n) { return n & 1; }); AnyIntRange xrange = nrange_filt; // this doesn't compile under G++ v4.8.3 for(int i : xrange) std::cout << i << std::endl; }