Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在C+;中使用非类型参数+;? 我在C++中读取数组对象的文档:我看到模板头是 template< class T, std::size_t N > struct array; 模板< T类, 标准:尺寸 >结构数组;_C++_Templates - Fatal编程技术网

为什么在C+;中使用非类型参数+;? 我在C++中读取数组对象的文档:我看到模板头是 template< class T, std::size_t N > struct array; 模板< T类, 标准:尺寸 >结构数组;

为什么在C+;中使用非类型参数+;? 我在C++中读取数组对象的文档:我看到模板头是 template< class T, std::size_t N > struct array; 模板< T类, 标准:尺寸 >结构数组;,c++,templates,C++,Templates,为什么N作为非类型参数传递,而不是将大小作为变量的构造函数传递给结构 当模板的整个点用于泛型类型时,非类型参数的用途是什么?非类型模板参数在编译时使用,并且使用唯一值实例化模板会创建新的类型或函数。然后,该信息可用于在运行时无法进行的“配置”。这对于模板类型来说有些水平-类模板参数T实现了不同类型的可重用性,而非类型模板参数提供了不同类型的可重用性 std::array就是一个很好的例子。我假设它的类定义有一个数据成员,它是一个大小为N的普通数组,例如 template<class T,

为什么
N
作为非类型参数传递,而不是将大小作为变量的构造函数传递给结构


当模板的整个点用于泛型类型时,非类型参数的用途是什么?

非类型模板参数在编译时使用,并且使用唯一值实例化模板会创建新的类型或函数。然后,该信息可用于在运行时无法进行的“配置”。这对于模板类型来说有些水平-类模板参数
T
实现了不同类型的可重用性,而非类型模板参数提供了不同类型的可重用性

std::array
就是一个很好的例子。我假设它的类定义有一个数据成员,它是一个大小为
N
的普通数组,例如

template<class T, std::size_t N>
struct array {
   // ...

   T wrapped[N];
};
模板
结构数组{
// ...
T包裹[N];
};
如果
N
是一个运行时值(例如,传递给构造函数),则无法执行此类操作


类模板的这种编译时“配置”有用的另一个例子是“小向量”,即具有固定缓冲区大小的容器,将动态内存分配延迟到缓冲区已满的位置。此类缓冲区大小也只能使用非类型模板参数指定。考虑到内存分配可能是性能瓶颈,这些技术非常重要。

STL中基本上有两个数组类:

  • std::vector
    是动态分配数组的包装器。它的大小可以在运行时更改,因此可以在构造函数中给定

  • 另一方面,
    std::array
    是静态数组的包装器(如
    int-values[10];
    )。它的大小必须在编译时已知,并且不能在运行时更改。这就是为什么大小是一个模板参数,不能传递给构造函数


如果大小是可变的,它将与std::vector相同泛型不是模板的全部要点。