第一章就简单介绍
模板参数的自动推导:
template<typename t1, typename t2, typename t3, typename t4> void fun(t1 a, t2 b, t4 c)
fun<double, int, int>(1, 2, 3) //用typeid测试后,发现省却参数的自动推导是按照顺序的。也就是说double int int只确定了t1 t2 t3的类型,然后函数的传人参数却有一个t4类型,由于没有传人模板,编译器便通过传人参数c自动推导t4的模板(这里是int).fun<double, char, char>(2,"char",anytype)
模板默认值:
template<typename t1 = int, typename t2>
模板函数、类体:
通过网上知道,模板的实现是随用随生成的。没有真实函数实现代码,所以定义和声明放入头文件中。讨厌的话可以用export改变。
//声明
template<typename T>
T fun(T v)
//定义
tempalte int fun(int v)//作者表示编译器会自动寻找合适模板实现,但是测试没成功
//caller1.cpp
#include<iostream>
tempalte<typename T>
void fun(t v) {
std::cout<<"func1"<<v;
}
void caller1() {
fun(1);
fun(0.1);
}
//caller2.cpp
#include<iostream>
tempalte<typename T>
void fun(t v) {
std::cout<<"func2"<<v;
}
void caller2() {
fun(1);
fun(0.1);
}
//main.cpp
void caller1();
void caller2();
int main() {
caller1();
caller2();
return 0;
}
//测试发现链接器链接时基于函数名、模板实参列表、参数列表判断函数模板实例等价。
所以最先创建的fun函数只要模板和后面的一样,为了方便会继续调用那个fun函数,不会另外开辟。