如何部分专用化函数模板

How can I partially specialize a function template?

本文关键字:函数模板 专用 何部      更新时间:2023-10-16

我无法解释为什么在下面的情况下无法实现部分模板专业化。有什么技术原因吗?最重要的是,是否有任何解决方法可以使其工作?

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

您可以使用结构进行部分专用化:

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

函数不能部分专用化。通常,重载函数或使用SFINAE要容易得多。

如果不可能 - 就像在这种情况下,因为 SFINAE 和重载只能处理类型 - 可以部分地将具有所述函数的类作为静态成员 - 尽管它通常更类型化。