#include <iterator>
#include <vector>
template<typename T>
class reverse;
template<typename T>
class reverse<T&> {
private:
T& _iterable;
public:
explicit reverse(T& iterable) : _iterable{iterable} {}
auto begin() const { return std::rbegin(_iterable); }
auto end() const { return std::rend(_iterable); }
};
template<typename T>
class reverse<T&&> {
private:
T _iterable;
public:
explicit reverse(T&& iterable) : _iterable{std::move(iterable)} {}
auto begin() const { return std::rbegin(_iterable); }
auto end() const { return std::rend(_iterable); }
};
template<typename T>
reverse(T&& v) -> reverse<decltype(std::forward<T>(v))>;
//Usage:
void foo(int);
std::vector<int> make_vec();
void test_lvalue(std::vector<int>& lvalue) {
for (auto i : reverse(lvalue)) {
foo(i);
}
}
void test_rvalue() {
for (auto i : reverse(make_vec())) {
foo(i);
}
}
Comments
0 B
|👍
/👎
0 B
|0 👍
/0 👎