C ++模板类型特征问题

时间:2018-01-15 01:47:36

标签: c++ templates metaprogramming template-meta-programming typetraits

我是制作自己的类型特征的新手,我想创建一个类型特征,允许我识别传递的类型是否是预期的容器。

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;

如果应该是真的,则上面评估为false。这只发生在数组类中,我相信它是由于它有2个模板参数没有默认值。我无法找到解决方法。

1 个答案:

答案 0 :(得分:3)

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

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

其次,std::array定义为:

T

作为第一个类型参数N和类型为std::size_t的非类型参数template<typename T, std::size_t N> struct is_array<std::array<T,N>> { static constexpr bool value = true; };

因此, true 专业化应该是:

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 {}; ,而是继承std::true_type and std::false_type,它提供了一些其他成员别名+转换运算符。然后代码变为:

IService