2010-10-02 9 views
3

Vu le code:membres statiques et des modèles en C++

#include <iostream> 
using namespace std; 
template <typename T> 
T my_max (const T &t1, const T &t2) 
{ 
    static int counter = 0; 
    counter++; 
    cout << counter << " "; 
    return ((t1 > t2) ? t1 : t2); 
} 
int main() 
{ 
    my_max (2,3); 
    my_max (3.5, 4.3); 
    my_max (3,2); 
    my_max ('a','c'); 
} 

La sortie est:

1 1 2 1 

Je comprends que l'organe statique est initialisé une seule fois. Ma question est de savoir comment le compilateur se souvient des types appelés cette fonction générique? Qu'est-ce qui se passe réellement dans les coulisses?

Répondre

8

Ce qui se passe est que le compilateur instancie la fonction pour chaque type (utilisé bien sûr). Donc, vous auriez les suivantes « fonctions » en interne:

int my_max (const int &t1, const int &t2) 
{ 
    static int counter = 0; 
    counter++; 
    cout << counter << " "; 
    return ((t1 > t2) ? t1 : t2); 
} 
... 
double my_max (const double &t1, const double &t2) 
{ 
    static int counter = 0; 
    counter++; 
    cout << counter << " "; 
    return ((t1 > t2) ? t1 : t2); 
} 
... 
char my_max (const char &t1, const char &t2) 
{ 
    static int counter = 0; 
    counter++; 
    cout << counter << " "; 
    return ((t1 > t2) ? t1 : t2); 
} 

Je pense qu'il est clair que chaque fonction est un membre indépendant. Ils ne partagent rien, sauf qu'ils sont générés par le même code de modèle.

2

Le compilateur ne se souvient pas des types. Il crée différentes fonctions pour différents types.

Questions connexes