C++ 启用_if作为模板参数
请告诉我为什么有效C++ 启用_if作为模板参数,c++,c++11,templates,enable-if,C++,C++11,Templates,Enable If,请告诉我为什么有效 如果在那之后我们可以忽略它,那么enable_发生了什么?(进一步使用Foo struct不需要在模板参数中启用_) 该代码不应该是这样的: 原始版本: template <typename Policy, typename = typename std::enable_if<std::is_base_of<BasePolicy, Policy>::value>::type > struct Foo; template
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() {
}
模板
结构Foo;
模板
结构Foo{
Foo();
};
模板
Foo::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() {
}
模板
结构Foo;
模板
结构Foo{//已添加!
Foo();
};
模板
Foo::Foo(){
}
发生这种情况:
在场)
被删除)
放回原处有人能解释为什么即使是编辑过的版本也能工作吗 当您尝试实例化
Foo
时,编译器会考虑带有默认模板参数的声明。计算默认参数,如果std::is_base_of::value
为false
,则enable_如果
产生SFINAE友好错误
如果std::is\u base\u of::value
为true
,则选择部分专门化
template <typename Policy>
struct Foo<Policy> {
Foo() { }
};
// is equivalent to
template <typename Policy>
struct Foo<Policy, void> {
Foo() { }
};
模板
结构Foo{
Foo(){}
};
//相当于
模板
结构Foo{
Foo(){}
};
上述专门化是等效的,因为默认情况下,
typename std::enable_if::type
是void
。“如果这样,那么enable_会发生什么情况?如果之后我们可以省略它?”-在什么之后。。。请你把你的问题说得更清楚一点好吗?如果你还包括原始代码,以使差异更容易理解,那就太好了。我说得很清楚,并添加了原始代码谁说原始代码必须工作?这是作者犯的一个错误。它首先有
,但作者在新版中删除了它。检查编辑历史记录和评论。感谢您的关注。你能解释一下为什么正确的版本有效吗?我的意思是C++的哪个特性使这个魔术发生?“莫尔:添加了一个解释:你是一个<代码>策略>代码> @ SombreroChicken:你只是一个<代码> BasePolicy <代码>。