#pragma once namespace iterator { namespace detail { struct terminal_layer_tag_t; struct continue_layer_tag_t; template struct void_t { using type = void; }; template using value_iterator = decltype(std::begin(*std::declval())); template using mapped_iterator = decltype(std::begin(std::declval()->second)); /** * @class next_layer_type * @breif A template metaprogramming type for unifying associative and * non-associative containers. */ template struct next_layer_type { using type = std::tuple; }; template struct next_layer_type { using type = V; }; }}