2011-07-17 9 views
5

Voglio scrivere una classe che gestisca il vettore euclideo e che memorizzi il suo punto iniziale usando short, int, long o float. Ho pensato di creare un modello come questo:Template: classe che utilizza int, short o float quando necessario

template<class unit> class EVector 
{ 
private: 
    unit x; 
    unit y; 
public: 
    EVector(); 
    setX(); 
    setY(); 
}; 

Così l'utente crea un EVector scegliendo il tipo primitivo adatto. Ma come posso implementare l'operazione tra diverse classi, ad es.

EVector<int> a; 
EVector<float> b; 

EVector<double> c; 

c = a + b; 

operator = copia le coordinate, l'operatore + le aggiunge.

+0

Questa domanda sembra calpestare in modo simile http://stackoverflow.com/questions/1629829/ambiguous-overload-on-template-operators Potrebbe essere utile. – Bart

+0

Allora, qual è la domanda? –

risposta

3

Per Inoltre, è possibile utilizzare la mia promote implementazione:

template<typename A, typename B> 
EVector<typename promote<A, B>::type> 
operator +(EVector<A> const& a, EVector<B> const& b) { 
    EVector<typename promote<A, B>::type> ev; 
    ev.setX(a.getX() + b.getX()); 
    ev.setY(a.getY() + b.getY()); 
    return ev; 
} 

Per i tipi double e int, sarà resa double per esempio.

+0

Quindi questa soluzione non prenderà in considerazione tutte le conversioni, solo le promozioni. Non sono sicuro se questo è ciò che l'OP vuole. Mi piace l'implementazione della promozione, quindi, ecco +1 da me;) –

+0

@Armen tutte le conversioni che "?:" Fa, che si riduce a tutte le conversioni se non sbaglio :) Ad esempio 'char *' e 'std :: string' funzionerà anche, anche se non è una promozione di alcun tipo. Il nome "promozione" potrebbe forse essere rinominato. Grazie per il tuo +1 :) –

+0

Se funzionerà con tutte le conversioni, qual è la necessità di un codice così spaventoso quando farebbe un semplice costruttore di copia basato su modelli e assegnazione di copia? –

2

si desidera attivare l'assegnazione (e copia-costruzioni) EVector<U>-EVector<T> quando U è convertibile in T

template<class T> 
class EVector 
{ 
    template<class U> 
    EVector(EVector<U> const & rhs) 
      :x(rhs.x), y(rhs.y) 
    { 
    } 
    ... 
} 

Si noti che anche se hai fornito questo costruttore di copia su modelli, il compilatore genererà un copy-constructor per te (quando T è uguale a U). In questo caso stai bene con quell'implementazione di default: fa esattamente quello che ti serve. Altrimenti dovresti definire esplicitamente anche il costruttore non contemplato (e il compito di copia).

+0

"Si noti che una volta fornito questo costruttore di copia basato su modello, sarà necessario fornire anche un oggetto nontemplato", questo non è vero :) –

+0

@Johannes: Perché no? :) –

+0

@Johannes: Oh, OK, ho capito ... penserò a come modificare ora ... :) –

Problemi correlati