Enable_if 作为模板参数

Enable_if as template parameter

请告诉我为什么 this answer 有效。

  1. 后面的enable_if是怎么回事,以后可以省略吗? (进一步使用 Foo 结构不需要模板参数中的 enable_if)
  2. 该代码不应该是这样的:

原始版本:

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() {
}

编辑版本:

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

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

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

这件事发生了:

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

  2. 评论里有一些讨论导致作者修改代码,结果出错(<Policy>被删);

  3. 我改正了丢失的<Policy>.

  4. 的错误

Can anybody explains why even the edited version works?

当您尝试实例化 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>::type 默认为 void