C++ 模板类型特征问题

C++ Template Type Traits Issue

我是制作自己的类型特征的新手,我想制作一个类型特征,让我能够识别传递的类型是否是预期的容器。

template<typename T, typename ... Types>
struct is_array
{
    static constexpr bool value = false;
};

template<typename ... Types>
struct is_array<std::array<Types...>>
{
    static constexpr bool value = true;
};

我采用了上面的格式,它适用于除数组之外的所有容器类型:

constexpr bool state = is_array<std::array<int, 5>>::value;

上面的计算结果为假,而本应为真。这只发生在数组 class 上,我相信这是因为它有 2 个没有默认值的模板参数。我无法解决这个问题。

首先,你的特征应该有一个,而且只有一个模板参数:预期的数组类型:

template<typename T/*, typename ... Types*/>
struct is_array {
    static constexpr bool value = false;
};

其次,std::array定义为:

template<
    class T,
    std::size_t N
> struct array;

作为第一个类型参数 T 和类型 std::size_t 的非类型参数 N

因此,您的真正专业化应该是:

template<typename T, std::size_t N>
struct is_array<std::array<T,N>>
{
    static constexpr bool value = true;
};

请注意,我们更愿意继承 std::true_type and std::false_type,而不是定义成员 value,它提供一些其他成员别名 + 转换运算符。然后代码变为:

template<typename T>
struct is_array : std::false_type {};

template<typename T, std::size_t N>
struct is_array<std::array<T,N>> : std::true_type {};