2010-04-28 15 views
7

Tengo una clase MyClass que está templated en typename T. Pero adentro, quiero un método que está modelado en otro tipo TT (que no está relacionado con T).método con plantilla en T dentro de una clase con plantilla en TT: Es posible/correcto

Después de leer/retoques, me encontré con la siguiente notación:

template <typename T> 
class MyClass 
{ 
    public : 
     template<typename TT> 
     void MyMethod(const TT & param) ; 
} ; 

Por razones estilísticas (me gusta tener mi declaración de la clase de plantilla en un archivo de cabecera, y las definiciones de método en otro archivo de cabecera), I no definirá el método dentro de la declaración de clase. Por lo tanto, tengo que escribir como:

template <typename T>  // this is the type of the class 
template <typename TT> // this is the type of the method 
void MyClass<T>::MyMethod(const TT & param) 
{ 
    // etc. 
} 

Yo sabía que tenía que "declarar" las typenames utilizados en el procedimiento, pero no sabía exactamente cómo y encontrado a través de ensayos y errores.

El código anterior compila en Visual C++ 2008, pero: ¿Es esta la forma correcta de tener un método con plantilla en TT dentro de una clase con plantilla en T?

Como bonificación: ¿Hay problemas/sorpresas/limitaciones ocultos detrás de este tipo de código? (Creo que las especializaciones pueden ser bastante divertidas para escribir)

+1

En cuanto a las especializaciones: no puede especializar una función de miembro sin especializar explícitamente la clase contenedora: http://stackoverflow.com/questions/2097811/c-syntax-for-explicit-specialization-of-a-template- function-in-a-template-class/2114807 –

Respuesta

3

Esta es de hecho la forma correcta de hacer lo que quiere hacer, y funcionará en cada compilador C++ decente. Lo probé en gcc4.4 y la última versión de clang.

Existen problemas/sorpresas/limitaciones detrás de cualquier tipo de código.

El principal problema que podría surgir con este código es que no puede hacer que una función de plantilla sea virtual, por lo que si desea obtener el polimorfismo en el nivel de clase para su función de plantilla, no podrá implementarlo con una función externa.

0

Creo que está bien hacerlo. Eche un vistazo, por ejemplo, a la implementación de std :: vector. Usted tiene un vector de clase, que tiene algunos parámetros de plantilla (sobre todo un tipo de elemento), y en el interior, uno de sus constructores se declara de manera similar a su método. Tiene InputIterator como un parámetro de plantilla. Entonces creo que esta no es una práctica tan poco común.

Cuestiones relacionadas