这是什么类的模板定义?

时间:2017-04-13 15:33:40

标签: c++

template<class T> struct is_ref_wrapper<std::reference_wrapper<T>> : std::true_type {};

它出现在std::experimental::make_array的{​​{3}}中。它看起来很奇怪的原因是类名包含一个模板参数列表<std::reference_wrapper<T>>,只提到一个参数,但该参数位于类的模板参数内(即某些内容已被省略)。

2 个答案:

答案 0 :(得分:2)

您链接到的页面中的其他相关行是:

template<class> struct is_ref_wrapper : std::false_type {};

这定义了通用模板。下一行是专业化。

template<class T> struct is_ref_wrapper<std::reference_wrapper<T>> : std::true_type {};

使用is_ref_wrapper作为模板参数实例化std::reference_wrapper<T>时,会使用专门化。

答案 1 :(得分:2)

那条线与它上面的那条线串联:

template<class> struct is_ref_wrapper : std::false_type {};
template<class T> struct is_ref_wrapper<std::reference_wrapper<T>> : std::true_type {};

第一行声明(主)模板is_ref_wrapper。第二行声明了一个特化,当且仅当参数与某些std::reference_wrapper<T>的{​​{1}}匹配时,将选择该特化而不是主模板。这正是所要求的行为。