我需要将数组作为模板类型传递。怎么能实现它。例如,我想要这样的东西。
Fifo<array, Q_SIZE> f; // This is a queue of arrays (to avoid false sharing)
我应该代替数组?假设我需要一个 int 数组。另请注意,我不希望std::vector
或指向数组的指针。我想要整个基本数组,相当于说 int array [32] 。
答案 0 :(得分:5)
试试这个:
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";
}
答案 1 :(得分:3)
如果要在创建队列时传递数组类型,可以编写
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的数组。
答案 2 :(得分:3)
C ++ 11中的std::end
函数对数组类型有一个重载,可以很好地证明这一点
以下是它的可能实现:
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);
}
答案 3 :(得分:1)
我找到了解决方案。我可以将数组包装在一个结构中,例如下面。
typedef struct
{
int array[32];
} my_array;
然后我可以按如下方式使用它。
Fifo<my_array, Q_SIZE> f;