Modèle de classe avec les deux pointeur de type et de type régulier
De définir une classe de Nœud avec modèle pour sa valeur de type
template<class T>
class Node {
T val;
public:
Node (T & v) : val (v) {}
...
void print() { cout << v << endl; }
}
La plupart du temps, la valeur du noeud d'intérêt sera un objet de la classe, dire class Foo
. Dans ce cas, utilisez Node<Foo *>
sera plus commode. Mais il se pourrait aussi que le nœud tiendra époque primitive, dire int
. Ensuite, utilisez Node<int>
suffira.
Le problème est, certains de la fonction peut-être besoin de se comporter de façon différente selon que T
est un type de pointeur ou pas. Par exemple, print
devrait cout << *v
quand il est et cout << v
autrement.
Ce que j'ai essayé est de définir à la fois:
template<class T>
class Node {
T val;
public:
Node (T & v) : val (v) {}
...
void print() { cout << v << endl; }
}
template<class T>
class Node<T*> {
T* val;
public:
Node (T* v) : val (v) {}
...
void print() { cout << *v << endl; }
}
Il peut maintenant choisir la définition appropriée selon qu'il s'agit Node<int> or Node<int *>
Mais le problème devenir, les deux définitions de partager beaucoup de code. Je me demande si il y a meilleur moyen d'y parvenir.
Foo sont globalement affectés/objets d'occasion. Seulement en passant Foo* pour le champ de données ne pourront donner lieu à recréer les objets. Je dis simplement que le type T pour le Nœud, pas de Nœud lui-même.
Salut, avez-vous résolu ce problème? Je suis dans la même situation, où je veux simplement différentes de se comporter de destructeur. Spécialement, si c'est parametr valeur, je veux juste supprimer le nœud, mais si c'est un pointeur, je veux d'abord supprimer le pointeur et après que le nœud de soi.
OriginalL'auteur Oxdeadbeef | 2013-01-25
Vous devez vous connecter pour publier un commentaire.
Voir ceci: C++ template de la spécialisation, de l'appel de méthodes sur les types qui pourraient être des pointeurs ou des références sans ambiguïté
La même technique de travail ici, vous permettant de faire face avec la
val
comme une référence (ou un pointeur) de manière uniforme dans les deux cas.PFI peut aider à réduire la duplication de code, permettant le code commun pour les deux spécialisations, sans surcharge, en tant que bien.
Noter que la propriété sémantique se complique lorsque vous parfois l'utilisation d'un pointeur et parfois une instance -- quelle est la durée de vie de
val
si parfois c'est un pointeur d'un argument, et d'autres fois c'est une copie de l'argument, et comment vous faire respecter?OriginalL'auteur Yakk - Adam Nevraumont