C++泛型编程(1)非模板类型与模板分离编译

函数模板的模板参数

  • 模板类型参数
  • 一般来说,我们可以将模板类型参数看作说明符像内置类型或类类型说明符一样使用
  • 我们可以放入多个模板类型参数,也可以指定返回类型

template<typename T,typename U>放入多个模板参数,typename可以被替换为class T name(T *p)这里指定的返回类型为T,如果没有T的话返回类型就是void,T可以是string等一系列的。

  • 非类型模板参数

C++非模板参数的限制:
1.参数是常整形
2.指向外部链接对象的指针

条款1的解释是对实参的要求
形参可以这样写:

template<int val>

也可以这样写:

template<int const val>

而对于实参

templte<int val>
int add_val(int x){
	return x + val;
}

int w = 4;
int a = 5;
const int b = 6;
enum{
	c = 7;
}
int d1 = add_val<8>(w);//模板实参是字面值常量(正确)
int d2 = add_val<b>(w);//模板实参是const定义的常量(正确)
int d3 = add_val<c>(w);//模板实参是枚举值(正确)
int d4 = add_val(a)(w)//模板不是常量(错误)

对条款2的阐述:
指向外部链接对象的指针,这里有两层含义:1.非类型模板形参可以是指针;2.指针指向的对象必须是具有外部链接性的对象(另外对象必须必须是编译时常量表达式)
这里面涉及到外部链接和内部链接的概念,这些和C/C++中的编译过程和编译单元相关,可以查看参考文献中的文章。参考文献3种详细的提及了对实参和形参的要求:

这里要强调一点,我们对于非类型形参的限定要分两个方面看
1.对模板形参的限定,即template<>里面的参数
2.对模板实参的限定,即实例化时<>里面的参数

【对形参的要求】
1.字符串不可以作为非类型形参
2.整形,可转化为整形的类型都可以作为形参,比如int,char,long,unsigned,bool,short(enum声明的内部数据可以作为实参传递给int,但是一般不能当形参)
3.指向对象或函数的指针与引用(左值引用)可以作为形参

【对实参的要求】
1.**实参必须是编译时常量表达式,不能使用非const的局部变量,局部对象地址及动态对象**[非常重要]
2.非Const的全局指针,全局对象,全局变量都不是常量表达式。
3.由于形参的已经做了限定,字符串,浮点型即使是常量表达式也不可以作为非类型实参
备注:常量表达式基本上是字面值以及const修饰的变量

3.其他限制条件

非类型模板形参不能为浮点类型
非类型模板形参不能为类(class)

模板分离编译

分离编译: 一个程序(项目)由若干个源文件共同实现,每个源文件单独编译形成目标文件,多个目标文件和链接库进行链接处理形成可执行程序,称为分离编译模式。分离编译利于我们维护项目,看.h了解框架设计功能,看.cpp了解实现细节。
编译链接过程:

模板不支持分离编译------原因以及解决方法:
https://blog.csdn.net/weiaiyisheng_ljj/article/details/76691477?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-0&spm=1001.2101.3001.4242

posted @ 2022-09-17 19:07  WetYu  阅读(8)  评论(0)    收藏  举报