【问题标题】:Template class specialization with template class带有模板类的模板类特化
【发布时间】:2017-01-05 11:46:40
【问题描述】:

相关问题:

考虑以下代码:

  template <typename T>
  struct is_std_vector: std::false_type { };

  template<typename ValueType>
  struct is_std_vector<std::vector<ValueType>>: std::true_type { };

为什么这样的模板类特化语法是正确的? 以下似乎更合乎逻辑:

  template <typename T>
  struct is_std_vector: std::false_type { };

  template<> //--- because it is is_std_vector specialization
  template<typename ValueType>
  struct is_std_vector<std::vector<ValueType>>: std::true_type { };

【问题讨论】:

  • 第二个完全不合逻辑。 template&lt;&gt; 意味着您明确地只专注于一种类型的T。您正在做的是部分专业化(您指定了 T 的无限子集,即仅满足 std::vector&lt;some_other_t&gt; 形式的子集)

标签: c++ templates template-specialization


【解决方案1】:

类模板部分特化语法与函数模板语法密切相关。实际上,排序类模板偏特化的规则是基于函数模板偏序的。

您编写一个采用vector&lt;T&gt; 的函数的方式是:

template <class T>
void is_std_vector(vector<T> ) { ... }

所以你在vector&lt;T&gt; 上写专业化的方式是一样的:

template <class T>
class is_std_vector<vector<T>> { ... };

匹配is_std_vector 的特化将尝试从某个类型参数A 推导出vector&lt;T&gt; 中的T,因此它们以相同的方式编写是很有意义的。

对于完全专业化,我们使用template &lt;&gt; 作为占位符信号,以使完全专业化看起来类似于部分专业化。我不确定在这种特殊情况下额外的template &lt;&gt; 会起到什么作用。

【讨论】:

    猜你喜欢
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多