我是制作自己的类型特征的新手,我想创建一个类型特征,允许我识别传递的类型是否是预期的容器。
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个模板参数没有默认值。我无法找到解决方法。
答案 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