Enable_if 作为模板参数
Enable_if as template parameter
请告诉我为什么 this answer 有效。
- 后面的enable_if是怎么回事,以后可以省略吗? (进一步使用 Foo 结构不需要模板参数中的 enable_if)
- 该代码不应该是这样的:
原始版本:
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() {
}
这件事发生了:
作者发布了工作代码(出现了<Policy>
);
评论里有一些讨论导致作者修改代码,结果出错(<Policy>
被删);
我改正了丢失的<Policy>
.
的错误
Can anybody explains why even the edited version works?
当您尝试实例化 Foo<T>
时,编译器会考虑使用默认模板参数的声明。评估默认参数,如果 std::is_base_of<BasePolicy, Policy>::value
是 false
,则 enable_if
会产生 SFINAE 友好错误。
如果 std::is_base_of<BasePolicy, Policy>::value
是 true
,则选择偏特化。
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
。
请告诉我为什么 this answer 有效。
- 后面的enable_if是怎么回事,以后可以省略吗? (进一步使用 Foo 结构不需要模板参数中的 enable_if)
- 该代码不应该是这样的:
原始版本:
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() {
}
这件事发生了:
作者发布了工作代码(出现了
<Policy>
);评论里有一些讨论导致作者修改代码,结果出错(
<Policy>
被删);我改正了丢失的
<Policy>
. 的错误
Can anybody explains why even the edited version works?
当您尝试实例化 Foo<T>
时,编译器会考虑使用默认模板参数的声明。评估默认参数,如果 std::is_base_of<BasePolicy, Policy>::value
是 false
,则 enable_if
会产生 SFINAE 友好错误。
如果 std::is_base_of<BasePolicy, Policy>::value
是 true
,则选择偏特化。
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
。