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 {};
我是制作自己的类型特征的新手,我想制作一个类型特征,让我能够识别传递的类型是否是预期的容器。
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 {};