Enable_if作为模板参数

时间:2019-04-24 10:09:48

标签: c++ c++11 templates enable-if

请告诉我this answer为什么起作用。

  1. enable_if发生了​​什么,这样我们可以在此之后忽略它? (Foo结构的进一步使用不需要模板参数中的那个enable_if)
  2. 该代码是否应该像这样:

原始版本:

<svg viewBox="0 0 110 110">
  <path id="progress"
        d="M 5 5 A 50 50 0 0 0 105 5"
        fill="none"
        stroke="blue"
        stroke-width="2"
        pathLength="100"/>
</svg>

编辑版本:

template <typename Policy,
          typename = typename std::enable_if<std::is_base_of<BasePolicy, Policy>::value>::type >
struct Foo;

template <typename Policy>
struct Foo {
    Foo();
};

template <typename Policy>
Foo<Policy>::Foo() {
}

1 个答案:

答案 0 :(得分:3)

这发生了:

  1. 作者发布了工作代码(存在<Policy>);

  2. 注释中进行了一些讨论,导致作者编辑了代码,但他犯了一个错误(<Policy>被删除了);

  3. 我已纠正了使丢失的<Policy>丢失的错误。


  

任何人都可以解释为什么甚至编辑后的版本都可以工作吗?

当您尝试实例化Foo<T>时,编译器会考虑带有默认模板参数的声明。将评估默认参数,如果std::is_base_of<BasePolicy, Policy>::valuefalse,则enable_if会产生SFINAE友好错误。

如果std::is_base_of<BasePolicy, Policy>::valuetrue,则选择部分专业化。

template <typename Policy>
struct Foo<Policy> {
    Foo() { } 
};

// is equivalent to

template <typename Policy>
struct Foo<Policy, void> {
    Foo() { } 
};

上述专长是等效的,因为默认情况下typename std::enable_if<true>::typevoid