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

template<typename C>
struct container_traits {
  constexpr static bool is_array = false;
};

template<template <typename, std::size_t> class C, typename T, std::size_t N>
struct container_traits<C<T,N>> {
  constexpr static bool is_array = std::is_base_of<std::array<T,N>,C<T,N>>::value;
};
    
template<typename T, size_t S>
struct A : public std::array<T,S> {};
    
int main() {
    std::cout << container_traits<A<int, 5>>::is_array << std::endl;              // must return 1
    std::cout << container_traits<std::array<int, 10>>::is_array << std::endl;    // must return 1
    std::cout << container_traits<std::vector<int>>::is_array << std::endl;
    return 0;
}