2011-07-17 8 views
5

Quiero escribir una clase que maneje un vector euclidiano y que almacene su punto inicial usando short, int, long o float. Pensé crear una plantilla como esta:Plantilla - clase que usa int, short o float cuando es necesario

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

Así que el usuario crea un EVector eligiendo el tipo primitivo adecuado. Pero, ¿cómo puedo implementar la operación entre diferentes clases, p.

operator = copia las coordenadas, operador + las agrega.

+0

Esta pregunta parece pisar terreno similar http://stackoverflow.com/questions/1629829/ambiguous-overload-on-template-operators Podría ser útil para usted. – Bart

+0

Entonces, ¿cuál es la pregunta? –

Respuesta

3

Por otra parte, se puede usar mi promote aplicación:

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

Para los tipos de double y int, se producirá double por ejemplo.

+0

Por lo tanto, esta solución no tendrá en cuenta todas las conversiones, solo las promociones. No estoy seguro de si esto es lo que quiere el OP. Me gusta la implementación de promoción, así que, aquí está el +1 de mí;) –

+0

@ Armen todas las conversiones que '?:' Hace, que se reduce a todas las conversiones si no me equivoco :) Por ejemplo, 'char *' y 'std :: string' también funcionará, a pesar de que no es una promoción de ningún tipo. El nombre 'promote' podría quizás renombrarse. Gracias por su +1 :) –

+0

Si funciona para todas las conversiones, ¿cuál es la necesidad de dicho código aterrador cuando un copiador-constructor con plantilla simple y copia-asignación haría? –

2

desea habilitar la asignación (y copia-construcción) a partir de EVector<U> a EVector<T> cuando U es convertible en T

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

Tenga en cuenta que incluso si usted ha proporcionado esta plantilla constructor de copia, el compilador generará una copy-constructor para usted (cuando T es igual que U). En este caso, está bien con la implementación predeterminada: hace exactamente lo que necesita. Pero, de lo contrario, tendrías que definir explícitamente el constructor no seleccionado (y la copia-asignación) también.

+0

"Tenga en cuenta que una vez que haya proporcionado este constructor de copia con plantilla, tendrá que proporcionar explícitamente también una versión no modificada", esto no es cierto :) –

+0

@Johannes: ¿Por qué no? :) –

+0

@Johannes: Oh, OK, lo tengo ... Pensaré en cómo editar ahora ... :) –

Cuestiones relacionadas