部分模板专用化可能不适用于函数,但重载不是一回事吗?

Partial template specialization may not work for functions, but isn't overloading the same thing?

本文关键字:重载 一回事 函数 适用于 专用 不适用      更新时间:2023-10-16
函数

缺乏"部分模板专用化"真的是一个缺点吗?当我定义一个模板,以及一个重载作为专用化时,它似乎总是有效。

template<typename T>
static T Func(T a) { std::cout << "a"; return a; }
static long Func(long a) { std::cout << "b"; return a; }

例如,它在推理方面与Func<long>并不冲突。 Func(22l);调用正确的函数,没有歧义。

这不和函数的模板专用化一样好吗?公开此类功能是否存在我需要注意的陷阱?

编辑:我看到一个区别是Func<long>不可能调用重载,所以这里需要推理......绝对是一个潜在的混淆来源,特别是如果从另一个模板引用它。

另一个编辑:正如所指出的,这是一个完整的专业化,而不是部分专业化。幸运的是,它似乎仍然适用于部分:

template<typename T, typename U>
static U Func(T a, U b) { std::cout << "a"; return a; }
template<typename T>
static long Func(T a, long b) { std::cout << "b"; return a; }
Func<long>(12, 22);  // invokes template
Func<long>(12, 22l); // invokes "specialization"

考虑

template<class R, class T>
R convert(const T&);

假设我们想为convert<void>(/*something*/)做一些特别的事情(即,R void的情况)。您无法通过简单的重载或完全专业化来做到这一点。(通常的技巧是委托给帮助程序类模板的静态成员函数,该函数可以部分专用化。