如何选择部分模板专业化?
How partial template specialization chosen?
请解释一下模板专业化选择的规则。我有一个例子:
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
在专用 类 中会发生什么情况?有没有影响?
选择模板专业化分为五个步骤:
- 采用主模板声明。 (
<T1, T2 = int> S
)
- 填写用户指定的模板参数。 (
T1 <- float
)
- 仅限函数模板:推导额外的模板参数。
- 对剩余的模板参数使用默认值。 (
T2 <- int
)
- 使用偏序算法(C++14 14.5.6.2)选择最匹配的特化。 (
<float, int>
不匹配 <T, float>
,所以忽略专业化;唯一的可能性是主模板)
请解释一下模板专业化选择的规则。我有一个例子:
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
在专用 类 中会发生什么情况?有没有影响?
选择模板专业化分为五个步骤:
- 采用主模板声明。 (
<T1, T2 = int> S
) - 填写用户指定的模板参数。 (
T1 <- float
) - 仅限函数模板:推导额外的模板参数。
- 对剩余的模板参数使用默认值。 (
T2 <- int
) - 使用偏序算法(C++14 14.5.6.2)选择最匹配的特化。 (
<float, int>
不匹配<T, float>
,所以忽略专业化;唯一的可能性是主模板)