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));