type traits techniques 01


is_iterable

namespace detail_type_traits {
    template<class T>
    auto is_iterable(int) -> decltype(std::begin(std::declval<T&>()) != std::end(std::declval<T&>()), void(), ++std::declval<decltype(std::begin(std::declval<T&>()))&>(), void(*std::begin(std::declval<T&>())),std::true_type{});
    template<class T>
    std::false_type is_iterable(...);
}
template<class T>
using is_iterable = decltype(detail_type_traits::is_iterable<T>(0));

source: https://stackoverflow.com/questions/13830158/check-if-a-variable-is-iterable

is_gettable (usable like as tuple)

namespace detail_type_traits {
    template<class T>
    auto is_gettable(int) -> decltype(std::get<0>(std::declval<T&>()), std::true_type{});
    template<class T>
    std::false_type is_gettable(...);
}
template<class T>
using is_gettable = decltype(detail_type_traits::is_gettable<T>(0));

Example