#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;
}
I2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KCnRlbXBsYXRlPHR5cGVuYW1lIEM+CnN0cnVjdCBjb250YWluZXJfdHJhaXRzIHsKICBjb25zdGV4cHIgc3RhdGljIGJvb2wgaXNfYXJyYXkgPSBmYWxzZTsKfTsKCnRlbXBsYXRlPHRlbXBsYXRlIDx0eXBlbmFtZSwgc3RkOjpzaXplX3Q+IGNsYXNzIEMsIHR5cGVuYW1lIFQsIHN0ZDo6c2l6ZV90IE4+CnN0cnVjdCBjb250YWluZXJfdHJhaXRzPEM8VCxOPj4gewogIGNvbnN0ZXhwciBzdGF0aWMgYm9vbCBpc19hcnJheSA9IHN0ZDo6aXNfYmFzZV9vZjxzdGQ6OmFycmF5PFQsTj4sQzxULE4+Pjo6dmFsdWU7Cn07CiAgICAKdGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IFM+CnN0cnVjdCBBIDogcHVibGljIHN0ZDo6YXJyYXk8VCxTPiB7fTsKICAgIAppbnQgbWFpbigpIHsKICAgIHN0ZDo6Y291dCA8PCBjb250YWluZXJfdHJhaXRzPEE8aW50LCA1Pj46OmlzX2FycmF5IDw8IHN0ZDo6ZW5kbDsgICAgICAgICAgICAgIC8vIG11c3QgcmV0dXJuIDEKICAgIHN0ZDo6Y291dCA8PCBjb250YWluZXJfdHJhaXRzPHN0ZDo6YXJyYXk8aW50LCAxMD4+Ojppc19hcnJheSA8PCBzdGQ6OmVuZGw7ICAgIC8vIG11c3QgcmV0dXJuIDEKICAgIHN0ZDo6Y291dCA8PCBjb250YWluZXJfdHJhaXRzPHN0ZDo6dmVjdG9yPGludD4+Ojppc19hcnJheSA8PCBzdGQ6OmVuZGw7CiAgICByZXR1cm4gMDsKfQ==