#pragma once #define _val(type) std::declval() #define exists(expr) void_t namespace iterator::detail { template using void_t = void; template struct reference_helper { using type = decltype(*std::declval()); }; template struct reference_helper> { using type = typename T::reference; }; template struct value_type_helper { using reference = typename reference_helper::type; using type = std::remove_cv_t>; }; template struct value_type_helper> { using type = typename T::value_type; }; template using value_type = typename value_type_helper::type; template using reference = typename reference_helper::type; }