A type trait for std::array

A type trait for std::array

本文关键字:array std for type trait      更新时间:2023-10-16

我试图定义一个类型特征,我可以使用static_assert来控制我的模板类之一仅与s td::array<T,n>实例化。下面是我的尝试:

template <typename T>
struct is_std_array : public false_type {};
template <template <typename, size_t> class T, typename V, size_t n>
struct is_std_array<std::array<V, n>> : public true_type {};

但是我从clang中得到以下警告:

warning: class template partial specialization contains a template parameter
that cannot be deduced; this partial specialization will never be used
non-deductible template parameter 'T'

为什么'T'不可免赔?我该如何解决这个问题?

你的专门化语法是错误的:

template <template <typename, size_t> class T, typename V, size_t n>

您在这里引入了三个模板参数:第一个是名为T的模板模板参数,它接受两个参数:一个类型和一个size_t。因为T在你的专门化子句中没有被引用:

struct is_std_array<std::array<V, n>> // <== no T

是一个非推导的上下文。考虑同样编写的函数:

template <template <typename, size_t> class T, typename V, size_t n>
void foo(std::array<V, n> );

这里,T也是一个非推导的上下文,因此必须显式指定。然而,您实际上根本不需要T !只有Vn。您的意思是直接引入两个相关参数:

template <typename V, size_t n>
struct is_std_array<std::array<V, n>> : public true_type {};