由于std :: array<>和std :: is_array<>这些都是在C ++ 11中引入的,但是编译失败似乎很奇怪:
#include <array>
#include <type_traits>
static_assert(std::is_array<std::array<int,2>>::value);
是否有一种简单的方法可以检查某些内容是否为数组,包括T[N]
和std::array<T,N>
的可能性?
答案 0 :(得分:4)
ISO / IEC 14882:2011,§20.9.4.1,表47说明了这一点:
模板:模板结构is_array;
条件:T是已知或未知范围的数组类型(3.9.2)
注释:类模板数组(23.3.2)不是数组类型。
所以,断言应该失败。
虽然您可以按照@ 0x499602D2的建议专门化is_array
,但如果您这样做,则应该在另一个命名空间中这样做,因为您不应该尝试更改标准化函数的含义。
答案 1 :(得分:1)
Cppreference提供了这种可能的实现:
template<class T>
struct is_array : std::false_type {};
template<class T>
struct is_array<T[]> : std::true_type {};
template<class T, std::size_t N>
struct is_array<T[N]> : std::true_type {};
不幸的是,它没有为std::array
提供专业化。你可以这样做:
template<class T>
struct is_array : std::is_array<T> {};
template<class T, std::size_t N>
struct is_array<std::array<T, N>> : std::true_type {};