首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

模板函数如何"知道"作为模板参数给出的数组的大小?

在C++编程中,模板函数可以通过std::size()函数或std::extent来获取作为模板参数给出的数组的大小。

例如,以下代码展示了如何使用std::size()函数获取数组大小:

代码语言:cpp
复制
#include<iostream>
#include<array>

template<typename T, std::size_t N>
void print_array(const std::array<T, N>& arr) {
    std::cout << "Array size: " << N << std::endl;
    for (std::size_t i = 0; i < N; ++i) {
        std::cout<< arr[i] << ' ';
    }
    std::cout<< std::endl;
}

int main() {
    std::array<int, 5> arr = {1, 2, 3, 4, 5};
    print_array(arr);
    return 0;
}

在这个例子中,print_array函数是一个模板函数,它接受一个std::array作为参数。std::array的大小是模板参数N,我们可以在函数内部使用N来获取数组的大小。

另一种方法是使用std::extent,它是一个类型特征,可以用来获取数组的大小。例如:

代码语言:cpp
复制
#include<iostream>
#include<array>
#include <type_traits>

template<typename T, std::size_t N>
void print_array(const std::array<T, N>& arr) {
    std::cout << "Array size: "<< std::extent<std::array<T, N>>::value<< std::endl;
    for (std::size_t i = 0; i < N; ++i) {
        std::cout<< arr[i] << ' ';
    }
    std::cout<< std::endl;
}

int main() {
    std::array<int, 5> arr = {1, 2, 3, 4, 5};
    print_array(arr);
    return 0;
}

在这个例子中,我们使用std::extent来获取数组的大小。std::extent是一个类型特征,它的value成员表示数组的大小。

总之,模板函数可以通过std::size()函数或std::extent来获取作为模板参数给出的数组的大小。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++11函数模板默认模板参数

2.函数模板默认模板参数特点 函数模板默认模板参数用法虽然与类模板默认模板参数函数默认参数用法类似,但是有一个显著特点,即当函数模板拥有多个默认模板参数时,其出现顺序可以任意,不需要连续出现在模板参数最后面...,而在C++11中,函数模板默认模板参数出现位置则比较灵活,可以出现在任意位置。...2.3函数模板参数推导规则 函数模板参数推导规则是如果能够从函数实参中推导出类型的话,则函数模板默认模板参数则不会被使用,反之,默认模板参数则可能被使用。...,因此函数调用testTemplateFunc(4)将根据函数模板实例化出模板函数调用是testTemplateFunc(4,0),其中第二个模板参数U使用了默认模板类型参数...从上面的例子也可以看出,因为函数模板模板参数是由函数实参推导而来,所以默认模板参数通常需要跟默认函数参数一起使用,不然默认模板参数存在将没有意义。

2.4K20
  • 【C++】泛型编程 ⑧ ( 类模板继承语法 | 普通类 继承 类模板语法 | 类模板 继承 类模板语法 | 继承类模板必须指定具体类型参数列表 | 继承 类模板 必须重写构造函数 )

    一、普通类 继承 类模板语法 1、普通类 继承 类模板语法 类模板 作为父类 , 子类 继承 类模板 父类 , 需要 指定 具体类型参数列表 ; 需要 重写 构造函数 , 其中必须调用 类模板 具体类... 子类 : // 类模板 继承时 , 需要具体化 类模板 // 也就是 指定 类模板 类型参数列表 , 将 泛型类型 固定下来 // C++ 编译器 只有知道了具体类型 , 才能知道 父类占用内存大小..., C++ 编译器需要知道 具体 数据类型 是什么 , 才能生成 具体类 , 只有这样 , 将具体数据类型固定下来 , C++ 编译器 才能知道 父类 所占 内存大小 , 才能正确分配内存 ;...继承时 , 需要具体化 类模板 // 也就是 指定 类模板 类型参数列表 , 将 泛型类型 固定下来 // C++ 编译器 只有知道了具体类型 , 才能知道 父类占用内存大小 // 才能正确分配内存...继承时 , 需要具体化 类模板 // 也就是 指定 类模板 类型参数列表 , 将 泛型类型 固定下来 // C++ 编译器 只有知道了具体类型 , 才能知道 父类占用内存大小 // 才能正确分配内存

    89930

    C++11:利用模板简化重载右值引用参数函数

    左值引用版本和右值引用版本函数 下面是matrix_cl类两个重载构造函数,这两个构造函数除了最后一个参数不同,其他参数都完全一样,只有最后一个参数不同(分别为右值和左值引用)。...当调用该构造函数时,如果最后一个参数为右值引用时候,会优先调用第一个构造函数,使用移动语义std:move()将rv转为右值,将rv内容赋值给this->v,这时调用是std::vector移动赋值操作符...E为类模板参数,请忽视,下同。...如果真是这样的话,这代码就太臃肿了,可维护性也不好啊,能不能将两个函数合并为一个? yes!we can 如果要把上面两个函数合并为一个就要用到模板编程了。 下面是合并后代码。...std::move(v):v; }; 有了_ENABLE进行参数类型限制,在类中有多个类型模板构造函数情况,调用构造函数时就不会将别的类型参数误传入,而产生编译错误。

    84310

    C++11:模板函数实现支持变长参数简单日志输出

    我们知道,log4cpp,glog都为C++程序提供了强大日志输出功能,能实现远远超上面的很多功能,但是有的时候我真的不需要这么强日志输出,而且引入这些第三方库也要折腾一阵子,如果程序要支持跨平台编译...为了解决这个问题,我想到基于C++11变长参数模板,自己实现一个简单控制台信息输出功能。...关于变长参数模板,现在也有不少入门文章介绍,不了解概念童鞋可以搜索一下,随便找一篇供参考: 《使用C++11变长参数模板 处理任意长度、类型之参数实例》 变长模板、变长参数C++11提供新特性...,利用变长参数模板,可以处理任意长度、类型参数实例。...有这个语言特性帮助,就可以像java语言一样,定义可以接收任意长度不同类型参数函数

    2.3K10

    C++模板函数参数类型和返回值类型方法

    参考链接: C++编程默认参数(参数) 假设要利用模板元编程获取位于index参数类型:  template struct ArgTypeAt...{     // FuntionType返回值类型和参数类型?...  这时FunctionType就是一个单独类型int(int, short, float)了,里面含有各参数类型。...要把FuntionType分离成返回值类型和参数类型,方法是利用模板特化,然后参数类型是一个包,再把参数包展开就能得到各位置参数类型:  template<int index, class FuntionType...(默认是__cdecl)改成__stdcall这个模板特化就不匹配了,因为修饰符也是类型一部分,而C++泛型并没有修饰符变了还能匹配方法(只有类型变了能匹配)。

    4.1K50

    【C++】泛型编程 ⑬ ( 类模板示例 - 数组模板 | 构造函数和析构函数 声明与实现 | 普通成员函数 声明与实现 | 外部友元函数 声明与实现 )

    一、类模板示例 - 数组模板 1、需求分析 类模板 作用就是 令 算法 和 数据类型分离 ; 本篇博客中 开始 使用 类模板 开发一个 数组类 , 数组 中 可以维护 不同类型 元素数据 , 如...: int , char , 自定义类 ; 数组模板 中 , 需要开发要素如下 : 构造函数 , 初始化 数组数据 ; 拷贝构造函数 , 根据一个现有的 数组模板对象 , 创建一个新 实例对象..., 用于对比 数组实例对象 ; 数组 数据类型 , 直接 使用 泛型 T 类型 , 这样数组就可以作为容器 , 存放任意类型数据 ; template class Array..., 类模板内部定义 操作符重载函数 , 其 左操作数 必须是 类本身 ; 外部友元函数 声明 : 声明时 , 需要在 函数名 和 参数列表之间 注明 泛型类型 ; 实现时 , 不能在 函数名...Array& a); } 外部友元函数 实现 : 在外部 实现 类模板 友元函数 , 首先 , 还是注明 模板类型 , template ; 然后 , 在 函数参数 /

    43310

    Shell编程中关于数组作为参数传递给函数若干问题解读

    2、 数组引用基本语法那么先让我们抛弃上面的不同写法,回归到最本质东西:给定一个数组arr=(1 2 3 4 5 6) ,如何对该数组进行变量传递呢?...格式如下:${arr[*]}如何理解这个语法呢?...3、 数组作为参数传递给函数若干问题说明以下通过例子来说明传参数组遇到问题以及原因:第一、关于$1 问题[root@iZuf6gxtsgxni1r88kx9rtZ linux_cmd]# cat...,而这里由于只向函数传递了1个参数并且该参数数组,因此在这种特定情况下也可以取传递数组参数。...(echo ${myarray[*]}) 是将数组写成n1 n2 n3 n4 n5 ...形式,如下:对函数参数 $arg2形式:[root@iZuf6gxtsgxni1r88kx9rtZ linux_cmd

    11310

    VFP过程或函数如何接收数组参数或返回一数组结果?

    最近碰到一个项目,需要通过数组来传值。 一、给过程或函数传递一个数组参数。...sendarr(@abc) Function sendarr Lparameters ltarray_b RETURN ltarray_b[3] Endfun 这里传值,我们注意一个@,这个小老鼠...数据传值,使用是地址引用传值。 二、过程或函数传递返回一个数组。 LOCAL ARRAY abc[5] abc=returnarr() ?abc[1] ?abc[2] ?abc[3] ?...三、过程或函数传递返回几个数组。 LOCAL ARRAY a[5] LOCAL ARRAY b[3] returnarr_more(@a,@b) ?a[1] ?a[2] ?a[3] ?b[1] ?...ENDFUNC 上面的代码,其实是引用址传递,过程或函数直接改变传递参数值,而已。所以我们也可以看到有些函数参数,有一个是返回值参数。就是上面的用法。 好了。总结这些,为狐友们参考!

    3.2K30

    如何优雅传递 stl 容器作为函数参数来实现元素插入和遍历?

    ,直接使用 std::vector 这个容器作为参数(有的人可能觉得我多此一举,直接在函数里访问 m_svrmsgs 成员不就行了,为什么要通过参数传递呢?...于是自然而然想到,我们这里能不能声明 back_inserter 作为输入参数呢?...注意这里相同类型要写两遍,一遍是函数模板参数,一遍是函数参数。...特别是还研究了如何将这种方式实现模板函数在不同文件中分别声明与实现,达到解除代码耦合目的,具有较强实用性。...C++模板之隐式实例化、显示实例化、隐式调用、显示调用和模板特化详解 [9]. c++模板函数声明和定义分离 [10]. C++模板编程:如何使非通用模板函数实现声明和定义分离

    3.6K20

    【c++】模板编程解密:C++中特化、实例化和分离编译

    类型形参即:出现在模板参数列表中,跟在class或者typename之类参数类型名称 非类型形参,就是用一个常量作为类(函数)模板一个参数,在类(函数)模板中可将该参数当成常量来使用 非类型模板参数允许你将一个值...,我们只能用宏定义来确定数组大小,那如果我一次性想要开两个大小不同数组呢?...,它表示数组大小,而 T 是一个类型模板参数代表数组中元素类型 使用方法: array a1; array a2; 注意: 浮点数、类对象以及字符串是不允许作为非类型模板参数...编译器在处理非模板函数声明时,无需知道函数实现细节,它只需要知道函数签名(返回类型、函数名和参数列表)。...实例化过程中,编译器使用具体类型替换模板参数。 对于非模板函数,声明和定义可以分离,因为编译器知道函数大小和调用约定,所以它可以在没有函数情况下编译调用该函数代码。

    50310

    【C++】泛型编程——模板进阶

    下面我们通过一个栗子细细给大家介绍一下: 2.2 铺垫 假设我们现在要写一个静态顺序表,那我们就可以这样搞 首先这里我们定义了一个标识符(宏)常量N,用N作为当前静态数组大小,就使得我们后续想要改变数组大小时候很方便...其次,我们把它实现成了一个类模板,该类模板有一个模板参数T,那通过上面的了解我们知道这里T其实就是一个类型模板参数,它定义是一个类型,这样我们在使用该类模板时候,指定什么类型,实例化出来数组模板类...那这里我们想让a1大小为10,a2大小为20 这与类型无关啊,那这种情况又该如何解决呢? ,那非类型模板参数引入,其实就很好解决了这种问题。...不过呢,这里提一下,就是C++20允许使用float或double作为非类型模板参数。 另外要知道: 非类型模板参数必须在编译期间就能确认结果。...其实可以认为就是静态数组,我们看到文档给解释是固定大小序列容器 我们看到array这个类模板其实就用了一个非类型模板参数作为这个数组大小

    22210

    【C++修炼之路】14.模板进阶

    ,但如果我们新增一个需求,让对象a1静态数组大小为10,对象a2静态数组大小为100,即使两个对象静态数组大小不同,这样需求上面的代码是无法实现,此时,就需要非类型模板参数来完成这个要求...这就是之前我们所学参数为变量类型,如:int、double、char等等。 非类型形参:就是用一个常量作为类(函数)模板一个参数,在类(函数)模板中可将该参数当成常量来使用。...在上面的场景中要求到,a1静态数组大小为10,a2静态数组大小为100,了解了非类型形参之后,就可以解决这个问题了: //静态数组 //非类型模板参数 -- 常量:灵活赋值 template<class...顾名思义非类型模板参数就是不是类型参数,通过之前学习内容,我们知道对于类型模板参数,通常是用class或者typename来修饰。...,特化时特别给出,因此函数模板不建议特化,重载更好。

    25800

    “突破 C++ 模板界限:提升代码复用性和可维护性“

    非类型形参:就是用一个常量作为类型(函数)模版一个参数,在类(函数)模版中可将该参数当做常量来使用。...() { Stack st1; Stack st2; } 用宏定义来定义一个数组大小,无法开出根据需求开出大小不同栈,因此,非类型形参,用一个常量N来作为类型(函数模版)一个参数...,N非类型模版参数,代表数组大小。...,就不走模版生成了 } 注意:一般情况下如果函数模板遇到不能处理或者处理有误类型,为了实现简单通常都是将该函数直接给出。...头文件中没有包含模板定义:如果 a.h 中只包含了模板函数声明,而没有包含模板定义(就像代码那样),那么编译器在编译 main.cpp 时将无法实例化 Add 函数,因为它不知道如何实现它。

    6610

    C++:模版进阶 | Priority_queue模拟实现

    非类型形参,就是用一个常量作为类(函数)模板一个参数,在类(函数)模板中可将该参数当成常量来使用。 注意: 非类型模板参数必须在编译期就能确认结果。...(分离编译会讲解) 我们来介绍一个c++11引入array array底层其实封装是一个静态数组。并且用到了非类型形参,在这里指代是底层静态数组容量大小。...(1)为了增加检查功能,我们知道vs对于静态数组越界功能是抽查行为,因此不是很安全,而我们把他封装在类里面,这样就可以去写个断言来防止数组越界 (2)[ ]重载不仅可以增加检查功能,还可以去控制静态数组内容是否可以被写...只能是和int相似类型才行,比如char、short、int、long int ……浮点数类对象以及字符串是不允许作为非类型模板参数。...并且这种函数实现简单明了,代码可读性高,容易书写,因为对于一些参数类型复杂函数模板,特化时特别给出,因此函数模板不建议特化。

    11410

    【C++】模板进阶

    ;而非类型形参则是用一个常量作为模板/函数模板一个参数,在类模板/函数模板中可将该参数当成常量来使用。...2、C++11 中 array 类 C++ 11 中引入了一个新类 – array,array 使用非类型形参作为模板参数,其底层其实就相当于静态数组: 由于 array 底层是静态数组,所以 array...-- 确实,由于函数支持重载,所以我们完全可以将重载一个/多个特殊类型形参;所以,一般情况下如果函数模板遇到不能处理或者处理有误类型,为了实现简单通常都是将该函数直接给出 (函数重载)。...本身 } 如上,对于一些参数类型复杂函数模板直接给出,即实现为函数重载,这种方法该种实现简单明了,代码可读性高,容易书写,因此函数模板不建议特化。...---- 三、模板分离编译 阅读我博客同学会发现,自从学习了模板以后,凡是要用到模板类我们成员函数声明和定义都是放在一起,或者是直接在类中给出函数定义,而不提供函数声明,比如我们模拟实现

    43700

    【C++】模板进阶

    ---- ---- 一、非类型模板参数(用整型类型变量来作为模板参数,传参时只能传常量) 1.非类型模板参数规定 1....模板参数分为类型模板参数和非类型模板参数,类型模板参数一般是class或typename定义出来泛型,而非类型模板参数一般是整型定义出来常量,这个常量作为模板函数模板一个参数,在类模板函数模板中可将该参数当成常量来使用...在C语言阶段如果想要让数组大小可以自己控制,一般都会用定义宏方式来解决,在C++中我们可以使用非类型模板参数来进行解决,下面代码给出模板声明,在使用时我们可以显示实例化类模板,给非类型模板参数传一个常量...//非类型模板参数主要还是用于,在类里面定义某些数组时,想要通过非类型模板参数大小来定义数组大小。 return 0; } 2.C++array类对标C语言静态数组 1....而如果遇到参数类型十分复杂模板时,特化时需要特别给出,书写起来较为繁琐,不如直接重载函数快。

    1K20
    领券