2010-07-20 3 views
3

Y a-t-il une différence, à partir de la prospective de la méta-programmation par exemple, entre les deux déclarations ?typedef déclaration de la classe de modèle

template<typename T> 
struct matrix { 
    typedef matrix self_type; // or 
    typedef matrix<T> self_type; 
}; 

merci

+0

Par 'matrice struct {' ​​Je pense que vous voulez dire 'matrice struct {'. – kennytm

+0

@Kenny merci fixe – Anycorn

Répondre

6

Dans cette situation particulière (à l'intérieur d'un modèle de classe), matrix est un raccourci pour matrix<T>. Lorsque vous écrivez beaucoup de modèles poilus tout au long de la journée tout en essayant de tout mettre dans 80 colonnes, la sténographie est la bienvenue.

Notez que vous pouvez également abrégez arguments de la méthode:

template <typename T> 
struct matrix 
{ 
    typedef matrix my_type; 
    matrix(); // constructor is abbreviated too 
    matrix& operator=(matrix); 
}; 

// Method argument types can be abbreviated too 
// but not result types. 
template <typename T> 
matrix<T>& matrix<T>::operator=(matrix m) 
{ 
    // ... 
} 
+5

Notez que le terme est * nom de classe injecté * et le modèle d'origine peut être consulté en utilisant un nom qualifié comme ':: matrix'. –

0

Ils se réfèrent tous deux au même type. La seule différence que je peux voir est du point de vue performance: Je suppose (en fonction de l'implémentation du compilateur) que seule la matrice fait référence à la classe elle-même, donc elle n'a besoin de rien de l'environnement. La matrice parle de la matrice de classes modélisée par T (c'est-à-dire, la matrice), donc il faut peut-être plus de mécanisme de déduction du compilateur. Mais je ne fais que deviner, je n'ai jamais rien lu à ce sujet.

Questions connexes