2013-06-27 21 views
5

Von einigen Dias über Template-Spezialisierung Überlastung:Template Funktion Spezialisierung vs.

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

Warum ist der zweite Weg, um mehr „angemessen“?

+2

Relevante Lektüre: [Warum nicht spezielle Funktionsvorlagen?] (Http://www.gotw.ca/publications/mill17.htm) – juanchopanza

+0

Sind diese Folien online verfügbar? –

+0

@Vaughn In einem Dropbox-Ordner ... – nodwj

Antwort

1

Die Überladung funktioniert für die meisten Kontexte gut, und AFAIK ist der vorgeschlagene Basisansatz. (siehe GOTW vorgeschlagen von Juanchopanza)

Der Unterschied trifft, wenn jemand explizit nach der Vorlage fragt, min<int>(x, y) aufrufen. In diesem Fall werden Überladungen ignoriert und nur die Vorlage (Basis oder spezialisiert) berücksichtigt.

+0

Auch wenn jemand die Funktion innerhalb einer anderen Vorlage verwendet. – Daemin

+1

@Daemin: Können Sie erweitern, was Sie meinen? –

+0

In einer Funktion 'template T foo (const T & amp ;, const T & b)' nennen sie 'min (a, b);' daher würde es die Vorlagenversion verwenden, unabhängig von Überladungen ohne Vorlagen. – Daemin