#include <iostream>
#include <type_traits>
#include <vector>

namespace detail
{
    // To allow ADL with custom begin/end
    using std::begin;
    using std::end;

    template <typename T>
    auto is_iterable_impl(int)
    -> decltype (
        begin(std::declval<T&>()) != end(std::declval<T&>()), // begin/end and operator !=
        ++std::declval<decltype(begin(std::declval<T&>()))&>(), // operator ++
        *begin(std::declval<T&>()), // operator*
        std::true_type{});

    template <typename T>
    std::false_type is_iterable_impl(...);

}

template <typename T>
using is_iterable = decltype(detail::is_iterable_impl<T>(0));


static_assert(is_iterable<std::vector<int>>::value, "");
static_assert(is_iterable<int[42]>::value, "");
static_assert(!is_iterable<int>::value, "");

int main()
{
	std::cout << is_iterable<std::vector<int>>::value << std::endl;
	std::cout << is_iterable<int[42]>::value << std::endl;
	std::cout << is_iterable<int>::value << std::endl;
}
