Modelo de classe com tipo de ponteiro e tipo regular

Eu defino uma classe Node com template para seu tipo de valor

template<class T>
class Node {
  T val;
  public:
    Node (T & v) : val (v) {}
    ...
    void print() { cout << v << endl; }
}

Na maioria das vezes, o valor do nó de interesse será uma classe de objeto, digamosclass Foo. Nesse caso, useNode<Foo *> será mais conveniente. Mas também pode ser que o nó mantenha tempo primitivo, digamosint. Então useNode<int> será suficiente.

O problema é que algumas das funções podem precisar se comportar de maneira diferenteT é um tipo de ponteiro ou não. Por exemplo,print devemoscout << *v quando é ecout << v de outra forma.

O que eu tentei é definir ambos:

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; }
}

Agora ele pode escolher a definição apropriada com base em se éNode<int> or Node<int *> Mas o problema se torna, as duas definições irão compartilhar muitos códigos. Eu estou querendo saber se há melhor maneira de conseguir isso.

questionAnswers(1)

yourAnswerToTheQuestion