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.

Pouvez-vous expliquer pourquoi vous pensez que Noeud<Foo*> serait plus pratique que de Noeud<Foo>? Si ce Nœud est utilisé comme un arbre de nœuds par exemple, puis le Noeud<Foo>* serait une meilleure solution
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