如何部分专门化功能模板?

时间:2016-01-25 19:40:43

标签: c++ templates

我无法解释为什么在下面的情况下不能进行部分模板专业化。有技术原因吗?大多数情况下,是否有任何工作可以使其发挥作用?

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

2 个答案:

答案 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>