代码之家  ›  专栏  ›  技术社区  ›  Fabio

部分专门化上下文中默认模板参数的角色

  •  0
  • Fabio  · 技术社区  · 6 年前

    我不清楚在部分专门化的上下文中默认模板参数的交互作用,如何选择更好的匹配模板。这个问题源于这个网站上发布的代码 answer 由max66。

    给出了类的定义 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 (即选择专业化)。这一点很清楚,因为主模板 专业化也会产生 条件(&L);B、 布尔常数<正确>&燃气轮机;

    3) cond<A<1>>::value 计算结果为 条件(&L);B、 布尔常数<正确>&燃气轮机; 专业化产生 cond<B, bool_constant<false>>

    我假设(3)中的行为是由于主模板的默认模板参数和专门化之间的一些交互作用造成的。在这个 answer Jerry Coffin说了一些可以解释这种行为的东西:

    然后选择基础模板。

    有人能详细解释一下这个规则吗?谢谢

    1 回复  |  直到 6 年前
        1
  •  1
  •   Jarod42    6 年前
    template <typename, typename Enable = bool_constant<true>>
    struct cond : public bool_constant<false> {};
    

    与相同

    template <typename, typename Enable = bool_constant<true>> struct cond;
    
    template <typename, typename Enable>
    struct cond : public bool_constant<false> {};
    

    稍后可能会更清楚地了解结果。

    cond<C> ,由于默认参数,它等价于 cond<C, bool_constant<true>> .

    “更好的实例化”

    我们可以选择:

    // primary template
    template <typename, typename Enable>
    struct cond : public bool_constant<false> {};
    

    以及部分专业化,使用SFINAE:

    // specialization
    template <typename T>
    struct cond<T, bool_constant<(0 == T::code)>> : public bool_constant<true> {};
    

    如果 0 == T::code

    否则如果 计算结果为 false ,专用化不匹配,并且还使用了主模板。
    注意,使用 cond<C, bool_constant<false>> 在这种情况下会使用专门化。

    0==T::代码 计算结果为 true