9

我需要将数组作为模板类型传递。怎么可能达到。例如,我想要这样的东西。

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

我应该用什么代替数组假设我需要一个int数组。另请注意,我不想要std::vector或指向数组的指针。我想要整个基本数组,相当于说int array[32]

4

4 回答 4

6

试试这个:

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";
}
于 2012-04-12T17:10:05.507 回答
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 的数组了。

于 2012-04-12T17:14:32.273 回答
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);
}
于 2015-11-01T02:10:04.033 回答
1

好吧,我找到了解决方案。我可以将数组包装在一个结构中,如下所示。

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

然后我可以按如下方式使用它。

Fifo<my_array, Q_SIZE> f; 
于 2012-04-12T17:16:40.140 回答