2012-04-12 19 views
5

Potrzebuję przekazać tablicę jako typ szablonu. Jak to osiągnąć. Na przykład chcę czegoś takiego.Przekaż tablicę jako typ szablonu

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

Co należy umieścić w miejscu tablicy? Załóżmy, że potrzebuję tablicy int. Zauważ też, że nie chcę std::vector lub wskaźnika do tablicy. Chcę całą podstawową tablicę, coś równoważnego powiedzmy int array [32].

+2

Jeśli używasz C++ 11 'std :: array 'powinno załatwić sprawę –

+0

@ user1018562 Czy możesz wcześniej wpisać tablicę? Mam na myśli 'typedef int myArrayType [16]', a następnie przekazuję myArrayType. – qdii

+0

jeśli używasz boost 'boost :: array ' – Anycorn

Odpowiedz

4

Spróbuj tego:

Fifo<int[32], Q_SIZE> f; 

tak:

#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

Jeśli chcesz przekazać typ tablicy podczas tworzenia kolejki można napisać

template <typename Array> 
struct Fifo; 

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

}; 

lub po prostu

template <typename Array> 
struct Fifo 
{ 
}; 

i używać go jak

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

} 

Następnie, należy zrozumieć, że int[10] jest zupełnie inny typ od int[11], a kiedy stworzył Fifo<int[10]> nie można tu przechowywać tablic o rozmiarze 11 lub 9 więcej.

1

Cóż, znalazłem rozwiązanie. Mogę owinąć tablicę w strukturę, taką jak poniżej.

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

Następnie mogę użyć go w następujący sposób.

Fifo<my_array, Q_SIZE> f; 
2

std::end funkcja C++ 11 ma przeciążenia dla typów tablicowe, że dobrze wykazać.
Oto możliwe wdrożenie go:

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

Jeśli potrzebujesz obiekt, który otacza tablicę, na matrycy funkcja fabryka pomoże jej tworzenia:

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); 
} 
Powiązane problemy