Teniendo en cuenta los siguientes dos escenarios de uso (exactamente como los ves, es decir, el usuario final sólo estará interesado en utilizar Vector2_t
y Vector3_t
):Herencia frente a la especialización
[1] Herencia:
template<typename T, size_t N> struct VectorBase
{
};
template<typename T> struct Vector2 : VectorBase<T, 2>
{
};
template<typename T> struct Vector3 : VectorBase<T, 3>
{
};
typedef Vector2<float> Vector2_t;
typedef Vector3<float> Vector3_t;
[2] Estructura del máster:
template<typename T, size_t N> struct Vector
{
};
template<typename T> struct Vector<T, 2>
{
};
template<typename T> struct Vector<T, 3>
{
};
typedef Vector<float, 2> Vector2_t;
typedef Vector<float, 3> Vector3_t;
no puedo hacer mi mente en cuanto a que es una solución mejor. La ventaja obvia de la herencia es la reutilización del código en las clases derivadas; una posible desventaja es el rendimiento (mayor tamaño, los usuarios pueden pasar por valor, etc.). La especialización parece evitar todo eso, pero a costa de tener que repetirme muchas veces.
¿Qué otras ventajas/desventajas extrañé, y en su opinión, qué ruta debo tomar?
La respuesta más completa. ¡Gracias! –
respuesta agradable y FRÍO. Toma un gurú para obtener una respuesta tan elegante. –
+1. Sospecho que su sugerencia de enable_if <> en una sola plantilla de clase es la mejor: seguramente las únicas diferencias entre las clases de plantilla para diferentes dimensiones de vector serían la cantidad de parámetros en el constructor. –