2012-05-16 9 views
5

En this question el OP pidió una solución a la plantilla typedef que no es posible en C++. El PO también presentó una solución a sí mismos, pero no le gustó:¿Por qué es la plantilla typedef un problema en C++ (no C++ 11)

template<size_t N, size_t M> 
class Matrix { 
    // .... 
}; 

// Problem - will not compile 
typedef Matrix<N,1> Vector<N>; 

// Solution 
template <int N> 
class Vector: public Matrix<N,1> 
{ }; 

Mi pregunta es, ¿qué ventaja tiene el Helper::typesolution nos dé sobre la solución de la OP (suponiendo que estas clases no están hechas para ser utilizado por un puntero de base o new 'd como tal)? Una clase vacía no debería tener gastos generales en el lanzamiento (¿o no?). La única desventaja que puedo ver es que en las compilaciones de depuración tendrás que expandir la clase base al depurar.

EDIT: Además de la respuesta seleccionada, consulte la respuesta de @ Dani que sugirió que la versión heredada requeriría la definición de constructores, lo que es un inconveniente adicional.

+0

Si nada más, 'Helper :: type' es realmente el tipo correcto. Ha pasado un tiempo desde que cavé seriamente en esas cosas, pero IIRC hay algunos problemas sutiles con la deducción de tipos y cosas por el estilo. – Hurkyl

Respuesta

7

El objetivo de typedef es definir un alias de tipo. Una subclase no es un alias de tipo: es un tipo nuevo.

Por ejemplo, imaginemos una función de biblioteca

template<size_t N, size_t M> 
Matrix<N, M> * createMatrix(); 

Ahora con helper de tipo

Vector<3>::type * var = createMatrix<3, 1>(); 

es legal.
Con la herencia

Vector<3> * var = createMatrix<3, 1>(); 

no lo es.

+0

Claro, pero estamos creando nuevos tipos de todos modos (cada vez que los argumentos de la plantilla son diferentes), así que al final, ¿hay realmente una diferencia? – Samaursa

+0

@Samaursa ver mi edición. –

7

Es porque los constructores no se heredan (y en C++ 11 no de forma predeterminada). Así que debe copiar todas las construcciones no predeterminadas, incluso si simplemente llama al constructor de la clase base en la implementación.

+0

aha! ¡Esto se me escapó por la razón que sea! Perfecto gracias. – Samaursa

3

Aparte todos prueban la sintaxis (que puede ser subjetiva) la diferencia principal es que, por inherencia, el vector es en realidad otro tipo que se descompone en matriz, mientras usa un helper que contiene un typedef, el vector es un alias de matriz (al menos para lo que se aplica la especialización parcial).

La diferencia requiere vector de redefinir constructores (que no se heredan), o algunos peligros potenciales en caso de operaciones definidas en términos de especialización de plantilla (con typedef, nunca serán vistos como "differnet")

Cuestiones relacionadas