2009-02-13 20 views
9

En lugar de utilizarCrear un alias de tipo para una clase de plantilla

std::vector<Object> ObjectArray; 

me gustaría que fuera

MyArray<Object> ObjectArray; 

con todos los métodos std :: vector conservados. (Como push_back(), reserva(), etc ...)

Sin embargo, el uso de

typedef std::vector MyArray; 

no va a funcionar. ¿Debo usar una plantilla en su lugar? ¿Cómo?

+0

¿Podría explicar en * por qué * usted querría esto? –

+5

@Eydne, ¿qué pasa si quiere cambiar MyArray a std :: list bajo el capó sin romper el código existente? – strager

Respuesta

14

Lo que realmente quieres es un tipo de letra con plantilla. Lamentablemente, no son compatibles con la versión actual de C++, pero se agregarán en C++ 0x.

Por ahora, he aquí una posible solución:

template<class T> struct My { 
    typedef std::vector<T> Array; 
}; 

My<Object>::Array ObjectArray 

Sea o no que es mejor que el simple uso de std::vector directamente, voy a dejar a usted para decidir.

+0

Greg, gracias por arreglar mi sintaxis. ¿Puedes decir que he estado usando mucho Java últimamente? ;) – Thomas

+0

Uso inteligente de la metaprogramación. – spoulson

5

Otra forma:

#include <vector> 

template <typename T> 
struct MyArray 
    :std::vector<T> 
{ 
}; 

void func() 
{ 
    MyArray<int> my; 

    my.push_back(5); 

    MyArray<int>::iterator i; 
} 

compila para mí, pero es posible que algunas cosas disponibles en el vector <> necesitan ser "levantado" en MiMatriz.

+0

Esto puede ser una mala idea: std :: vector no tiene un destructor virtual. Si alguna vez necesita agregar un destructor a MyArray, existe la posibilidad de que no se invoque. – Mike

+0

Otro problema es que 'MyArray ' y 'std :: vector ' son tipos diferentes, y la resolución de sobrecarga se comportará de manera diferente para los dos [ejemplo] (http://coliru.stacked-crooked.com/a/04d76fda15a6ae5f) –

7

A partir de C++ 11 se puede utilizar un tipo de alias plantilla

template <typename T> 
using MyArray = std::vector<T>; 

Si quieres ser más genérico puede utilizar una plantilla variadic (lo que permitiría asignadores en el caso de vectores sin tener para ser específico)

template <typename... Ts> 
using MyArray = std::vector<Ts...>; 
Cuestiones relacionadas