The way I like to detect whether something is a container is to look for data() and size() member functions. Like this:
template
struct is_container : std::false_type {};
template
struct is_container().data())
, decltype(std::declval().size())>> : std::true_type {};