部分模板特化是 C++ 中泛型编程最重要的概念之一。例如:实现一个通用的交换函数:
template <typename T>
void swap(T &x, T &y) {
const T tmp = x;
y = x;
x = tmp;
}
将其专门用于支持 O(1) 交换的向量:
template <typename T, class Alloc>
void swap(vector<T, Alloc> &x, vector<T, Alloc> &y) { x.swap(y); }
因此,当您在通用函数中调用 swap(x, y) 时,您始终可以获得最佳性能;
非常感谢,如果您可以在替代语言中发布等效的(或语言的部分专业化的规范示例,如果该语言不支持交换概念)。
编辑:所以看起来很多回答/评论的人真的不知道部分专业化是什么,并且通用交换示例似乎妨碍了某些人的理解。一个更一般的例子是:
template <typename T>
void foo(T x) { generic_foo(x); }
部分专业化将是:
template <typename T>
void foo(vector<T> x) { partially_specialized_algo_for_vector(x); }
一个完整的专业化将是:
void foo(vector<bool> bitmap) { special_algo_for_bitmap(bitmap); }
为什么这很重要?因为您可以在通用函数中调用 foo(anything) :
template <typename T>
void bar(T x) {
// stuff...
foo(x);
// more stuff...
}
并在编译时获得最合适的实现。这是 C++ 以最小的性能损失实现抽象的一种方式。
希望它有助于澄清“部分专业化”的概念。在某种程度上,这就是 C++ 在不需要显式模式匹配语法(比如 Ocaml/F# 中的 match 关键字)的情况下进行类型模式匹配的方式,这有时会妨碍泛型编程。