2013-06-27 16 views
5

Da alcune diapositive su modello di specializzazione:Template specializzazione contro sovraccarico

#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; 
} 
*/ 

Perché è il secondo modo più "adeguato"?

+2

Lettura pertinente: [Perché non si specializzano i modelli di funzione?] (Http://www.gotw.ca/publications/mill17.htm) – juanchopanza

+0

Queste diapositive sono disponibili online? –

+0

@Vaughn In una cartella Casella personale ... – nodwj

risposta

1

Il sovraccarico funziona bene per la maggior parte dei contesti e AFAIK è l'approccio di base suggerito. (vedi GOTW suggerito da juanchopanza)

La differenza colpisce se qualcuno richiede esplicitamente il modello, chiamando min<int>(x, y). In tal caso i sovraccarichi vengono ignorati e viene preso in considerazione solo il modello (base o specializzato).

+0

Anche se qualcuno usa la funzione da un altro modello. – Daemin

+1

@Daemin: puoi ampliare ciò che intendi? –

+0

In una '' template T foo (const T & a, const T & b) 'chiamano' min (a, b); 'quindi userebbe la versione di modello indipendentemente da eventuali sovraccarichi non basati su modelli. – Daemin