我不清楚部分专业化背景下默认模板参数的交互,以选择哪个是更好的匹配模板。这个问题源于此中发布的代码answer https://stackoverflow.com/questions/52565407/use-of-enable-if-to-match-only-classes-which-have-a-certain-static-data-member由 max66 提供。
给定类的定义A
and 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) 中的行为是由于主模板的默认模板参数和专业化之间的某些交互造成的。在这个answer https://stackoverflow.com/a/18701381/5800661杰里·科芬(Jerry Coffin)陈述了一些可以解释这种行为的内容:
如果我们改变专业化,使其专业化
适用于基本模板提供的默认类型以外的类型
然后将选择基本模板。
有人可以详细说明一下这条规则吗?谢谢