#include #include #include #include #include #include namespace details { template auto has_iterator(int) -> decltype(std::begin(std::declval()), 0); template float has_iterator(float); template auto has_iterator() { return has_iterator(0); } } template struct has_iterator { static constexpr bool const value { std::is_same_v())> }; }; int main() { // Test negative cases (i.e. where it return false) static_assert( !has_iterator::value ); static_assert( !has_iterator::value ); // Test containers static_assert( has_iterator::value ); static_assert( has_iterator>::value ); static_assert( has_iterator>::value ); static_assert( has_iterator>::value ); // test C-arrays static_assert( has_iterator::value ); static_assert( has_iterator::value ); }