Специализация частичного шаблона является одной из наиболее важных концепций для общего программирования в С++. Например: для реализации общей функции свопинга:
template <typename T>
void swap(T &x, T &y) {
const T tmp = x;
y = x;
x = tmp;
}
Специализировать его для вектора поддержки O (1) swap:
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 (ничего) в общей функции:
template <typename T>
void bar(T x) {
// stuff...
foo(x);
// more stuff...
}
и получить наиболее подходящую реализацию во время компиляции. Это единственный способ для С++ достичь абстракции с минимальным штрафом за производительность.
Надеюсь, что это поможет разобраться в концепции "частичной специализации". В некотором смысле, это то, как С++ выполняет сопоставление шаблонов, не требуя явного синтаксиса сопоставления шаблонов (например, ключевое слово match в Ocaml/F #), которое иногда мешает универсальному программированию.