模版编程
- 写在尖括号内的包含两种内容:模版类型参数和非模版类型参数
- 可以为模版类型参数指定默认值
- 非模版类型参数同普通函数相比,前者是编译时常量,后者是运行时常量,编译器可以对前者在编译时进行优化(可通过
constexpr
指定某一变量是编译时常量) - 可定义多个模版参数
- 除非使用特殊手段,否则应将模版的声明和定义放置在一起,无法使用头文件函数声明和cpp文件函数定义分离的方式,问题在于会使二进制文件大小过大
调用函数模版,编译器推断模版参数类型的过程称为模版实例化,编译器在面对函数模版的定义时,是不生成代码的,只有当模版实例化时,才会真正生成代码,此性质称为延迟编译(不过在mac上的实际表现并非如此,可能和mac的编译器有关)
函数模版的原理是在编译时生成多份函数,编译器根据实例化代码生成对应类型的函数
模版的困难点在于编译期常量的限制,即所有涉及到模版参数的参数都必须是编译期常量,可通过constexpr关键字显示指定使得某些运行时常量变为编译时常量
Reference
- [1] 知无涯之C++ typename的起源与用法