【发布时间】:2018-01-15 01:47:35
【问题描述】:
我是创建自己的类型特征的新手,我想创建一个类型特征,让我能够识别传递的类型是否是预期的容器。
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;
当它应该为真时,上面的计算结果为假。这只发生在数组类中,我相信这是因为它有 2 个没有默认值的模板参数。我无法解决这个问题。
【问题讨论】:
-
std::array的实际特化永远不会匹配std::array<Types...>,因为它有一个非类型模板参数。你想要template<typename T, size_t N> struct is_array<std::array<T, N>> { ... }; -
在您的示例中,
5不是类型,因此与Types...不匹配。 -
更令人困惑的是,有一个
std::is_arraytrait 专门不 将std::array检测为一个数组。 -
所以
is_std_array会是一个更好的名字。
标签: c++ templates metaprogramming template-meta-programming typetraits