fork download
  1. #include <iterator>
  2. #include <type_traits>
  3. #include <utility>
  4.  
  5. template<typename T, typename=void>
  6. struct is_iterable : std::false_type {};
  7.  
  8. namespace aux {
  9. using std::begin;
  10. // note: no implementation
  11. template<typename C>
  12. auto adl_begin( C&& c )->decltype( begin( std::forward<C>(c) ) );
  13. using std::end;
  14. // note: no implementation
  15. template<typename C>
  16. auto adl_end( C&& c )->decltype( end( std::forward<C>(c) ) );
  17. }
  18. template<typename T>
  19. struct is_iterable<T,
  20. typename std::enable_if<
  21. std::is_same<
  22. typename std::iterator_traits< typename std::decay<decltype( aux::adl_begin( std::declval<T>() ) )>::type >::iterator_category,
  23. typename std::iterator_traits< typename std::decay<decltype( aux::adl_end( std::declval<T>() ) )>::type >::iterator_category
  24. >::value
  25. >::type
  26. > : std::true_type {};
  27. #include <vector>
  28. #include <iostream>
  29. int main() {
  30. std::cout << is_iterable< std::vector<int> >::value << "\n";
  31. std::cout << is_iterable< int >::value << "\n";
  32. }
Success #stdin #stdout 0s 2852KB
stdin
Standard input is empty
stdout
1
0