std :: array的类型特征

时间:2015-09-25 17:34:54

标签: c++ templates c++11

我正在尝试定义一个类型特征,我可以使用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'

为什么&#39; T&#39;不可扣除?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:8)

关于专业化的语法是错误的:

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 {};