2016-02-26 21 views
2

请向我解释模板专业化选择的规则。我举一个例子:如何选择部分模板专业化?

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会发生什么情况?它是否引入了一些影响力?

+4

我不明白为什么你会期望这里有什么不同。 'S '中的'float'是* first *类型参数'T1',而不是第二个'T2'。但专业化是为了如果'T2'是'浮动'。 – 5gon12eder

+0

@ 5gon12eder推测,OP试图指定部分特化('T')的模板参数;不是一个不常见的初学者错误。 –

+0

我最初的想法是,我指定一个模板参数,编译器应该选择专业化,因为它喜欢专业化基地。 – nikitablack

回答

6

选择模板专业化发生在五个步骤:

  1. 使主模板声明。 (<T1, T2 = int> S
  2. 填写用户指定的模板参数。 (T1 <- float
  3. 仅限函数模板:推导其他模板参数。
  4. 对剩余的模板参数使用默认值。 (T2 <- int
  5. 使用偏序排列算法(C++ 14 14.5.6.2)来选择最匹配的特化。 (<float, int>不匹配<T, float>,所以忽略专业化;只剩下可能性是主模板)
+0

这是合乎逻辑的!谢谢。 – nikitablack

+0

如果您在步骤5中查找部分排序的粗略解释,我建议您查看此答案:https://stackoverflow.com/a/17008568/1248889 –