1.C++模板
模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。
模板是创建泛型类或函数的蓝图或公式。
库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。
每个容器都有一个单一的定义,
比如 向量,我们可以定义许多不同类型的向量,比如 vector <int> 或 vector <string>。
#include <stdio.h>
#include<iostream>
using namespace std;
template <typename T1,typename T2>
void print(T1 value1,T2 value2){
cout << "value=" << value1+value2 << endl;
}
template <class T1,int SIZE>
class solution {
public:
void print(T1 value) {
cout << "value=" << value << endl;
}
void set(int i, int value) {
if (i >= SIZE) {
cout << "error" << endl;
}
else {
array[i] = value;
}
}
void print_array() {
for (int i = 0; i < SIZE; i++) {
cout << array[i] << " ";
}
cout << endl;
}
private:
int array[SIZE];
};
int main()
{
print(23,23.23);
print(23.67, 9);
solution<double,5> s;
s.set(0, 7);
s.set(1, 2);
s.set(2, 5);
s.set(3, 19);
s.set(4, 67);
s.print_array();
return 0;
}
2.C++模板是什么,底层怎么实现的?
编译器并不是把函数模板处理成能够处理任意类的函数;
编译器从函数模板通过具体类型产生不同的函数;
编译器会对函数模板进行两次编译:
在声明的地方对模板代码本身进行编译,在调用的地方对参数替换后的代码进行编译。
这是因为函数模板要被实例化后才能成为真正的函数,
在使用函数模板的源文件中包含函数模板的头文件,
如果该头文件中只有声明,没有定义,那编译器无法实例化该模板,最终导致链接错误。