模版编程

发布时间 2023-09-03 12:48:58作者: 0x7F
  1. 写在尖括号内的包含两种内容:模版类型参数和非模版类型参数
  2. 可以为模版类型参数指定默认值
  3. 非模版类型参数同普通函数相比,前者是编译时常量,后者是运行时常量,编译器可以对前者在编译时进行优化(可通过constexpr指定某一变量是编译时常量)
  4. 可定义多个模版参数
  5. 除非使用特殊手段,否则应将模版的声明和定义放置在一起,无法使用头文件函数声明和cpp文件函数定义分离的方式,问题在于会使二进制文件大小过大

调用函数模版,编译器推断模版参数类型的过程称为模版实例化,编译器在面对函数模版的定义时,是不生成代码的,只有当模版实例化时,才会真正生成代码,此性质称为延迟编译(不过在mac上的实际表现并非如此,可能和mac的编译器有关)
函数模版的原理是在编译时生成多份函数,编译器根据实例化代码生成对应类型的函数

模版的困难点在于编译期常量的限制,即所有涉及到模版参数的参数都必须是编译期常量,可通过constexpr关键字显示指定使得某些运行时常量变为编译时常量

Reference