Передать массив как тип шаблона
мне нужно передать массив как тип шаблона. Как этого достичь. Например, я хочу что-то подобное.
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;