#include <iterator>
#include <type_traits>
#include <utility>

    template<typename T, typename=void>
    struct is_iterable : std::false_type {};

    namespace aux {
      using std::begin;
      // note: no implementation
      template<typename C>
      auto adl_begin( C&& c )->decltype( begin( std::forward<C>(c) ) );
      using std::end;
      // note: no implementation
      template<typename C>
      auto adl_end( C&& c )->decltype( end( std::forward<C>(c) ) );
    }
    template<typename T>
    struct is_iterable<T,
      typename std::enable_if<
        std::is_same<
          typename std::iterator_traits< typename std::decay<decltype( aux::adl_begin( std::declval<T>() ) )>::type >::iterator_category,
          typename std::iterator_traits< typename std::decay<decltype( aux::adl_end( std::declval<T>() ) )>::type >::iterator_category
        >::value
      >::type
    > : std::true_type {};
#include <vector>
#include <iostream>
int main() {
    std::cout << is_iterable< std::vector<int> >::value << "\n";
    std::cout << is_iterable< int >::value << "\n";
}