将数组作为模板类型传递

Pass an array as template type

本文关键字:类型 数组      更新时间:2023-10-16

我需要传递一个数组作为模板类型。如何实现它。例如,我想要这样的东西。

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

我应该用什么来代替数组?假设我需要一个 int 数组。另请注意,我不想要std::vector或指向数组的指针。我想要整个基本数组,相当于 int 数组[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 的数组。

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);
}
好吧,

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

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

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

Fifo<my_array, Q_SIZE> f;