2011-08-14 14 views
9

En el documento de propuestas Variadic Templates de C++ 0x Link hay un ejemplo de una clase que admite un número arbitrario de dimensiones. He copiado a continuación:Variaded Templates Multidimensional Array Container

template<typename T, unsigned PrimaryDimension, unsigned... Dimensions> 
class array { /* implementation */ }; 

array<double, 3, 3> rotation matrix; // 3x3 rotation matrix 

Por desgracia, no se proporciona la aplicación. Como soy relativamente nuevo en las plantillas variadic, me gustaría ver una implementación de este contenedor.

Gracias a cualquiera que pueda proporcionar una implementación simple.

Respuesta

15

Aquí es una aplicación muy simple (compilado con gcc4.6.1) que demuestra la recursividad involucrada en conseguir el tipo de matriz derecha - si hay algún otro detalle de implementación específico que está interesado, por favor, háganoslo saber:

template<class T, unsigned ... RestD> struct array; 

template<class T, unsigned PrimaryD > 
    struct array<T, PrimaryD> 
{ 
    typedef T type[PrimaryD]; 
    type data; 
    T& operator[](unsigned i) { return data[i]; } 

}; 

template<class T, unsigned PrimaryD, unsigned ... RestD > 
    struct array<T, PrimaryD, RestD...> 
{ 
    typedef typename array<T, RestD...>::type OneDimensionDownArrayT; 
    typedef OneDimensionDownArrayT type[PrimaryD]; 
    type data; 
    OneDimensionDownArrayT& operator[](unsigned i) { return data[i]; } 
}; 

int main() 
{ 
    array<int, 2, 3>::type a4 = { { 1, 2, 3}, { 1, 2, 3} }; 
    array<int, 2, 3> a5{ { { 1, 2, 3}, { 4, 5, 6} } }; 
    std::cout << a5[1][2] << std::endl; 

    array<int, 3> a6{ {1, 2, 3} }; 
    std::cout << a6[1] << std::endl; 

    array<int, 1, 2, 3> a7{ { { { 1, 2, 3}, { 4, 5, 6 } } }}; 
    std::cout << a7[0][1][2] << std::endl; 
} 
+0

Gracias por la respuesta, Faisal. Eso es simplemente increíble. Muy elegante. Lo pregunté principalmente porque tengo una biblioteca de arreglos multidimensionales de tamaño fijo (Enlace aquí: http://code.google.com/p/fsma/) que proporciona envoltorios delgados alrededor de matrices incorporadas de 2d y 3d y es análoga a std: :formación. Me preguntaba cómo implementar una versión que permite un número arbitrario de dimensiones usando plantillas variadic después de leer el Documento del Comité Estándar sobre ellas. ¡No conocía el poder de las plantillas variadas hasta que leí tu respuesta! – Ricky65

+0

Para el comentario 2011-Ago-14 de @ faisal-vali, no estoy seguro de lo que intentas construir. No 'template arrayX ' se traduce a algo como 'arrayX ' given 'long, 2, 3, 5 'como los parámetros. El parámetro variadic debe expandirse a una lista separada por comas, cuyos límites de matriz anidados no califican. – CTMacUser

+0

@CTMacUser Sí, por supuesto, tiene razón; mi comentario carece de sentido y debería ser afectado. –