我需要传递一个数组作为模板类型。如何实现它。例如,我想要这样的东西。传递一个数组作为模板类型
Fifo<array, Q_SIZE> f; // This is a queue of arrays (to avoid false sharing)
我应该把什么到位阵列的?假设我需要一组int。另外请注意,我不想要std::vector
或指向数组的指针。我想要整个基本数组,相当于int array [32]。
我需要传递一个数组作为模板类型。如何实现它。例如,我想要这样的东西。传递一个数组作为模板类型
Fifo<array, Q_SIZE> f; // This is a queue of arrays (to avoid false sharing)
我应该把什么到位阵列的?假设我需要一组int。另外请注意,我不想要std::vector
或指向数组的指针。我想要整个基本数组,相当于int array [32]。
试试这个:
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的阵列了。
嗯,我找到了一个解决方案。我可以将数组包装在一个结构中,比如下面。
typedef struct
{
int array[32];
} my_array;
然后我可以使用它如下。
Fifo<my_array, Q_SIZE> f;
的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);
}
如果您使用C++ 11'STD :: array'应该诀窍 –
2012-04-12 16:56:39
@ user1018562你可以在之前的typedef数组吗?我的意思是'typedef int myArrayType [16]'然后传递myArrayType。 – qdii 2012-04-12 17:00:29
如果您使用boost boost :: array' –
Anycorn
2012-04-12 17:00:46