如何选择部分模板专业化?

nik*_*ack 4 c++ templates template-specialization

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

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

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

cout << boolalpha << S<float>::value;
Run Code Online (Sandbox Code Playgroud)

为什么输出false?一般来说,typename T2 = int专业类中的默认模板参数会发生什么?它会引入一些影响吗?

Seb*_*edl 8

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

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

  • 如果您正在寻找步骤5中对部分排序的粗略解释,我建议您查看以下答案:/sf/answers/1190599791/ (2认同)