请告诉我this answer为什么起作用。
原始版本:
<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() {
}
答案 0 :(得分:3)
这发生了:
作者发布了工作代码(存在<Policy>
);
注释中进行了一些讨论,导致作者编辑了代码,但他犯了一个错误(<Policy>
被删除了);
我已纠正了使丢失的<Policy>
丢失的错误。
任何人都可以解释为什么甚至编辑后的版本都可以工作吗?
当您尝试实例化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
。