5

Из некоторых слайдов о специализации шаблона:шаблона функция специализация по сравнению с перегрузкой

#include <iostream> 

using namespace std; 

template<class X> 
X& min(X& a, X& b) 
{ 
    return a > b ? b : a; 
} 

int& min(int& a, int & b) 
{ 
    // rewrite of the function in the case of int: 
    cout << "int explicit function\n"; 
    return a > b ? b : a; 
} 

/* 
new syntax – the more appropriate way: 
template<> 
int& min<int>(int& a, int& b) 
{ 
    cout << "int explicit function\n"; 
    return a > b ? b : a; 
} 
*/ 

Почему второй путь более «соответствующий»?

+2

Обращаем ваше внимание: [Почему бы не специализировать шаблоны функций?] (Http://www.gotw.ca/publications/mill17.htm) – juanchopanza

+0

Доступны ли эти слайды онлайн? –

+0

@Vaughn В папке с Dropbox ... – nodwj

ответ

1

Перегрузка работает отлично для большинства контекстов, и AFAIK является предлагаемым базовым подходом. (см. GOTW, предложенный juanchopanza)

Разница попадает, если кто-то явно запрашивает шаблон, вызывая min<int>(x, y). В этом случае перегрузки игнорируются и рассматриваются только шаблон (базовый или специализированный).

+0

Также, если кто-то использует функцию из другого шаблона. – Daemin

+1

@ Даэмин: Можете ли вы рассказать о том, что вы имеете в виду? –

+0

В функции 'template T foo (const T & a, const T & b)' они называют 'min (a, b);' следовательно, он будет использовать шаблонную версию, независимо от каких-либо не templated перегрузок. – Daemin