2012-04-12 21 views
5

Necesito pasar una matriz como tipo de plantilla. Como puede lograrlo Por ejemplo, quiero algo como esto.Pase una matriz como tipo de plantilla

Fifo<array, Q_SIZE> f; // This is a queue of arrays (to avoid false sharing) 

Qué debo poner en su lugar de gama? Supongamos que necesito una matriz de int. También tenga en cuenta que no quiero std::vector o un puntero a una matriz. Quiero todo el conjunto básico, algo equivalente a decir int array [32].

+2

Si estás usando C++ 11 'std :: array 'debería hacer el truco –

+0

@ user1018562 ¿Puede escribir def de su matriz antes? Me refiero a 'typedef int myArrayType [16]' y luego paso myArrayType. – qdii

+0

si está utilizando boost 'boost :: array ' – Anycorn

Respuesta

4

Prueba esto:

Fifo<int[32], Q_SIZE> f; 

De esta manera:

#include <iostream> 
template <class T, int N> 
struct Fifo { 
    T t; 
}; 

int main() { 
const int Q_SIZE = 32; 
Fifo<int[32],Q_SIZE> f; 
std::cout << sizeof f << "\n"; 
} 
2

Si desea pasar tipo array al crear la cola puede escribir

template <typename Array> 
struct Fifo; 

template <typename T, int size> 
struct Fifo<T[size]> 
{ 

}; 

o simplemente

template <typename Array> 
struct Fifo 
{ 
}; 

y utilizarlo como

int main() 
{ 
    Fifo<int[10]> fa; 

} 

Entonces, usted debe entender, que int[10] es completamente diferente tipo de int[11], y una vez que ha creado Fifo<int[10]> no se puede almacenar aquí matrices de tamaño 11 o 9 más.

1

Bueno, he encontrado una solución. Puedo envolver la matriz en una estructura, como a continuación.

typedef struct 
{ 
int array[32]; 
} my_array; 

Entonces puedo usarlo de la siguiente manera.

Fifo<my_array, Q_SIZE> f; 
2

La función std::end en C++ 11 tiene una sobrecarga para este tipo de matriz que bien demuestran esto.
He aquí una posible implementación de la misma:

template< class T, std::size_t N > 
T* end(T(&array)[N]) { 
    return array + N; 
} 

Si necesita un objeto que envuelve una matriz, una función de fábrica con plantilla ayudará a crearlo:

template< class T, std::size_t N > 
struct fifo { 
    T(&array)[N]; 
}; 

template< class T, std::size_t N > 
fifo<T,N> make_fifo(T(&array)[N]) { 
    return Fifo<T,N>{ array }; 
} 

int main() { 
    int arr[] = { 1,2,3,4,5 }; 

    // Create object from array using template argument deduction 
    auto fifo = make_fifo(arr); 
} 
Cuestiones relacionadas