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.