首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将数组作为模板类型传递

将数组作为模板类型传递
EN

Stack Overflow用户
提问于 2012-04-12 16:54:36
回答 4查看 22.3K关注 0票数 9

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

代码语言:javascript
运行
复制
Fifo<array, Q_SIZE> f; // This is a queue of arrays (to avoid false sharing)

我应该用什么来代替数组?假设我需要一个整数数组。还请注意,我不希望std::vector或指向数组的指针。我想要整个基本数组,相当于int array32。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-12 17:10:05

试试这个:

代码语言:javascript
运行
复制
Fifo<int[32], Q_SIZE> f; 

如下所示:

代码语言:javascript
运行
复制
#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";
}
票数 7
EN

Stack Overflow用户

发布于 2012-04-12 17:14:32

如果要在创建队列时传递数组类型,则可以编写

代码语言:javascript
运行
复制
template <typename Array>
struct Fifo;

template <typename T, int size>
struct Fifo<T[size]>
{

};

或者只是

代码语言:javascript
运行
复制
template <typename Array>
struct Fifo
{
};

然后把它当作

代码语言:javascript
运行
复制
int main()
{
    Fifo<int[10]> fa;

}

然后,您应该理解,int[10]int[11]是完全不同的类型,一旦创建了Fifo<int[10]>,就不能再在这里存储大小为11或9的数组了。

票数 3
EN

Stack Overflow用户

发布于 2015-11-01 02:10:04

std::end 11中的C++函数对数组类型具有重载,这很好地说明了这一点。

下面是它的一个可能的实现:

代码语言:javascript
运行
复制
template< class T, std::size_t N >
T* end(T(&array)[N]) {
    return array + N;
}

如果您需要一个包装数组的对象,模板化的工厂函数将帮助创建它:

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10128159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档