Skip to content

Instantly share code, notes, and snippets.

@HungMingWu
Created November 26, 2018 05:49
Show Gist options
  • Save HungMingWu/b6b6c615eb994d2d5f9c55a4273bed89 to your computer and use it in GitHub Desktop.
Save HungMingWu/b6b6c615eb994d2d5f9c55a4273bed89 to your computer and use it in GitHub Desktop.
enumerate in C++17
#include <tuple>
template <typename T,
typename TIter = decltype(std::begin(std::declval<T>())),
typename = decltype(std::end(std::declval<T>()))>
constexpr auto enumerate(T && iterable)
{
struct iterator
{
size_t i;
TIter iter;
bool operator != (const iterator & other) const { return iter != other.iter; }
void operator ++ () { ++i; ++iter; }
auto operator * () const { return std::tie(i, *iter); }
};
struct iterable_wrapper
{
T iterable;
auto begin() { return iterator{ 0, std::begin(iterable) }; }
auto end() { return iterator{ 0, std::end(iterable) }; }
};
return iterable_wrapper{ std::forward<T>(iterable) };
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment