【发布时间】:2018-10-01 02:16:19
【问题描述】:
我不清楚在部分专业化的上下文中默认模板参数的交互,以选择哪个是更好的匹配模板。这个问题源于 max66 在answer 中发布的代码。
给定类A和B的定义:
template <int N> struct A { static const int code = N; };
struct B{};
以及以下模板类:
// primary template
template <typename, typename Enable = bool_constant<true>>
struct cond : public bool_constant<false> {};
// specialization
template <typename T>
struct cond<T, bool_constant<(0 == T::code)>> : public bool_constant<true> {};
1) cond<B>::value 的计算结果为 false(即选择了主节点)。这很清楚,因为主模板产生 cond<B, bool_constant<true>>,特化失败,因此主模板是唯一可能的选择。
2) cond<A<0>>::value 计算结果为 true(即选择专业化)。这很清楚,因为主模板产生cond<B, bool_constant<true>>,特化也产生cond<B, bool_constant<true>>,因此特化是首选,因为第二个模板参数的参数是明确给出的。
3) cond<A<1>>::value 计算结果为 false(即选择了主节点)。这对我来说不是很清楚。主模板产生cond<B, bool_constant<true>>,专业化产生cond<B, bool_constant<false>>。鉴于第二个模板参数的参数在特化中明确给出,为什么不是首选?
我认为(3)中的行为是由于主模板的默认模板参数和专业化之间的一些交互。在这个answerJerry Coffin 中陈述了一些可以解释这种行为的东西:
如果我们改变专业化,使其专业化 用于基本模板提供的默认类型以外的类型 然后将选择基本模板。
有人可以详细说明这条规则吗?谢谢
【问题讨论】:
标签: c++ templates template-specialization partial-specialization