std::is_array
定义为仅适用于类似于T[]
或T[N]
的类型。不包括std::array
。
根据标准,您不能修改或专用std::is_array
为true_type
为std::array
;那会让你的程序不合格,不需要诊断。当std
中的类型专门化时,结果必须与标准一致,标准在此处具体说明。 (另外,对于std
内的其他模板这样做非常有问题)。
您可以创建自己的is_array
特点:
namespace notstd {
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{};
// optional:
template<class T>
struct is_array<T const>:is_array<T>{};
template<class T>
struct is_array<T volatile>:is_array<T>{};
template<class T>
struct is_array<T volatile const>:is_array<T>{};
}
然后使用notstd::is_array<T>
其他地方的检测无论是C风格的数组或C++ std::array
。
'std :: array'根本不是数组。他们只是称它为因为它比'std :: array_wrapper'或'std :: better_array'更方便。 – user2357112
@ user2357112:由于'is_array <>'的含义是由定义'array <>'的相同语言的完全相同版本决定的,所以“数组不是数组”的概念看起来很荒谬,不是吗? ? –
智能指针也不会传递'is_pointer'。 'std :: is_array'如果是特殊的'std :: array',将会不太有用,并且使得'std :: array'成为一个真正的数组将首先使得'std :: array'失败。只是不要让名字混淆你。 – user2357112