que estoy escribiendo una biblioteca matemática simple con un tipo de plantilla de vectores:especializaciones plantilla de clase con funcionalidad compartida
template<typename T, size_t N>
class Vector {
public:
Vector<T, N> &operator+=(Vector<T, N> const &other);
// ... more operators, functions ...
};
Ahora quieren alguna funcionalidad adicional específicamente para algunos de ellos. Digamos que quiero las funciones x()
y y()
en Vector<T, 2>
para acceder a determinadas coordenadas. Podría crear una especialización parcial para esto:
template<typename T>
class Vector<T, 3> {
public:
Vector<T, 3> &operator+=(Vector<T, 3> const &other);
// ... and again all the operators and functions ...
T x() const;
T y() const;
};
Pero ahora estoy repitiendo todo lo que ya existía en la plantilla genérica.
También podría usar la herencia. Cambiar el nombre de la plantilla genérica para VectorBase
, que podría hacer esto:
template<typename T, size_t N>
class Vector : public VectorBase<T, N> {
};
template<typename T>
class Vector<T, 3> : public VectorBase<T, 3> {
public:
T x() const;
T y() const;
};
Sin embargo, ahora el problema es que todos los operadores se definen en VectorBase
, por lo que vuelvo VectorBase
casos. Estos no se pueden asignar a Vector
variables:
Vector<float, 3> v;
Vector<float, 3> w;
w = 5 * v; // error: no conversion from VectorBase<float, 3> to Vector<float, 3>
que podría dar Vector
un constructor de conversión implícita para hacer esto posible:
template<typename T, size_t N>
class Vector : public VectorBase<T, N> {
public:
Vector(VectorBase<T, N> const &other);
};
Sin embargo, ahora estoy conversión de Vector
a VectorBase
y viceversa. Aunque los tipos son los mismos en la memoria, y el compilador puede optimizar todo esto, se siente torpe y realmente no me gusta tener una sobrecarga de tiempo de ejecución potencial para lo que es esencialmente un problema de tiempo de compilación.
¿Hay alguna otra manera de solucionar esto?
¿Por qué no simplemente hacer 'x()' y 'y()' funciones gratuitas que toman la especialización apropiada de 'Vector'? P.ej. 'plantilla T x (const Vector & v);' –
Posible, pero 'vx()' tiene más sentido para mí que 'x (v)'. Además, me gustaría agregar algunos constructores especializados, por ejemplo 'Vector (T, T) ', y los constructores no pueden ser funciones libres. –
Thomas
No, pero puede tener funciones que devuelvan objetos por valor en el estilo de' std :: make_pair'. –