【问题标题】:How partial template specialization chosen?偏模板专业化怎么选?
【发布时间】:2016-02-26 12:50:32
【问题描述】:

请解释一下模板专业化选择的规则。我有一个例子:

template<typename T1, typename T2 = int>
struct S : false_type{};

template<typename T>
struct S<T, float> : true_type{};

cout << boolalpha << S<float>::value;

为什么输出是false?一般来说,专用类中的默认模板参数typename T2 = int 会发生什么情况?会不会带来一些影响?

【问题讨论】:

  • 我不明白为什么你会期望这里有什么不同。 S&lt;float&gt; 中的float第一个 类型参数T1,而不是第二个T2。但如果T2float,则专业化。
  • @5gon12eder 推测,OP 正在尝试指定部分特化的模板参数(T);不是一个不常见的初学者错误。
  • 我最初的想法是id我指定了一个模板参数,编译器应该选择专业化,因为它更喜欢专业化而不是基础。

标签: c++ templates template-specialization


【解决方案1】:

选择模板专业化分为五个步骤:

  1. 采用主模板声明。 (&lt;T1, T2 = int&gt; S)
  2. 填写用户指定的模板参数。 (T1 &lt;- float)
  3. 仅限函数模板:推导出其他模板参数。
  4. 对剩余的模板参数使用默认值。 (T2 &lt;- int)
  5. 使用偏序算法 (C++14 14.5.6.2) 选择最匹配的特化。 (&lt;float, int&gt;&lt;T, float&gt; 不匹配,因此忽略特化;唯一的可能是主模板)

【讨论】:

猜你喜欢
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
相关资源
最近更新 更多