[modern c++][11] 非类型模板参数

前言:

我们再使用 std::get 的时候发现其模板并不是一个类型,而是一个整数值,用来标识从某个位置获取值,比如 std::pair 类型的数据 tmppair,那么就可以通过 std::get<0>(tmppair)来获取key的值,通过 std::get<1>(tmppair)来获取value的值。这就是非类型模板参数的一个用例。

非类型模板参数允许我们使用 值 作为模板类型,这个值可以是

  • 整数
  • 指向常量对象的指针
  • 指向常量函数的指针
  • 引用类型
  • 枚举常量
  • 类中的静态成员的常量表达式

注意到,这些值都是在编译时就可以获取到的。

Q:既然是使用值(左值/右值) 作为模板的某个参数,那么为什么不把这个值直接函数入参传递给函数呢?

A:模板的解析在编译期完成,我们通过非类型模板参数的方法可以在编译时期就完成某些运算和生成固定模式的代码。而函数的入参是在运行时才能确定的。因此区别就在于是运行时还是编译期。

整数:

用法:数组大小

标准库 std::array 就是使用第二个模板参数作为数组容量

Defined in header <array>

template<

    class T,
    std::size_t N

> struct array;

使用方法,std::array<int, 3> a1{{1, 2, 3}};

用法:偏移量

#include <iostream>
#include <string>
#include <array>

struct Student{
  std::string name;
  int value;
};

template <typename container,int index>
std::string getName(container c)
{
  return c[index].name;
}

int main()
{
  std::array<Student,3> students{{
          {"zhangsan",10},
          {"lisi",20},
          {"wangwu",30}
  }};
  std::cout << getName<std::array<Student, 3>, 2>(students) << std::endl;
}

运行结果: wangwu

上面代码里,就使用了非类型的模板参数,用来访问容器中某个index位置。

指针:

由于模板是在编译期展开的,因此传入指针的场景下,指针的地址值必须是已经计算好的常量,比如常量的地址,比如通过constexpr计算出来的地址。

引用:

同指针类似。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值