我无法解释为什么在下面的情况下不能进行部分模板专业化。有技术原因吗?大多数情况下,是否有任何工作可以使其发挥作用?
template <int a, int b>
void foo();
// DO NOT COMPILE
template <int a>
void foo<a, 999>() {
}
// COMPILE
template <>
void foo<999, 999>() {
}
template <int a, int b>
void foo() {
}
答案 0 :(得分:3)
您可以使用struct进行部分专业化:
template <int a, int b> struct foo_helper { void operator()() { /*code*/ } };
template <int a> struct foo_helper<a, 999> { void operator()() { /*code*/ } };
template <> struct foo_helper<999, 999> { void operator()() { /*code*/ } };
template <int a, int b>
void foo()
{
foo_helper<a, b>{}();
}
答案 1 :(得分:3)
功能不能部分专业化。通常,更容易使功能过载或使用SFINAE。
如果不可能 - 就像在这种情况下,因为SFINAE和重载只能在类型上起作用 - 可以部分地将具有所述函数的类专门化为它的静态成员 - 尽管它通常更多地打字。 / p>