Передать массив как тип шаблона

мне нужно передать массив как тип шаблона. Как этого достичь. Например, я хочу что-то подобное.

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

что я должен поставить на место массив? Предположим, мне нужен массив int. Также обратите внимание, что я не хочу std::vector или указатель на массив. Мне нужен весь базовый массив, что-то эквивалентное say int array[32].

4 ответов


попробуйте это:

Fifo<int[32], Q_SIZE> f; 

такой:

#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";
}

если вы хотите передать тип массива при создании очереди можно написать

template <typename Array>
struct Fifo;

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

};

или просто

template <typename Array>
struct Fifo
{
};

и использовать его как

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

}

потом, вы должны понять, что int[10] полностью отличается от int[11], и как только вы создали Fifo<int[10]> вы больше не можете хранить здесь массивы размером 11 или 9.


на std::end функция в C++ 11 имеет перегрузку для типов массивов, которые хорошо демонстрируют это.
Вот возможная реализация этого:

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

Если вам нужен объект, который обертывает массив, шаблонная заводская функция поможет его создать:

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);
}

Ну, я нашел решение. Я могу обернуть массив в структуру, такую как ниже.

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

затем я могу использовать его следующим образом.

Fifo<my_array, Q_SIZE> f;