https://github.com/Blitzer207/C-Resource/blob/master/第5阶段-C%2B%2B提高编程资料/提高编程能力资料/讲义/C%2B%2B提高编程.md

函数模板

template <typename T>
void myFunction(T param) {  // T 是模板类型参数
    // 函数实现
}

如上的myfunction是模板函数,要使用

通过传递实参,会自动推导T为实参类型(忽略 const 和引用)

int a = 10;
myFunction(a);

如果模板参数是引用 T&,则 T 的推导会保留实参的引用和 const 属性:

  template <typename T>
  void printType(T& param) {
      std::cout << typeid(T).name() << std::endl;
  }

  int main() {
      int x = 5;
      const int y = 10;
      printType(x);  // T 推导为 int
      printType(y);  // T 推导为 const int
  }

但这些情况都不适用于传入不同类型的参数,编译器无法自动推导 T

显式指定模板参数

int main() {
auto result = add(5, 3.2); // 显式指定 T=double
}

.3.2 类模板与函数模板区别
类模板与函数模板区别主要有两点:

类模板没有自动类型推导的使用方式
类模板在模板参数列表中可以有默认参数
示例:

#include <string>
//类模板
template<class NameType, class AgeType = int> 
class Person
{
public:
	Person(NameType name, AgeType age)
	{
		this->mName = name;
		this->mAge = age;
	}
	void showPerson()
	{
		cout << "name: " << this->mName << " age: " << this->mAge << endl;
	}
public:
	NameType mName;
	AgeType mAge;
};

//1、类模板没有自动类型推导的使用方式
void test01()
{
	// Person p("孙悟空", 1000); // 错误 类模板使用时候,不可以用自动类型推导
	Person <string ,int>p("孙悟空", 1000); //必须使用显示指定类型的方式,使用类模板
	p.showPerson();
}

//2、类模板在模板参数列表中可以有默认参数
void test02()
{
	Person <string> p("猪八戒", 999); //类模板中的模板参数列表 可以指定默认参数
	p.showPerson();
}

int main() {

	test01();

	test02();

	system("pause");

	return 0;
}

总结:

类模板使用只能用显示指定类型方式
类模板中的模板参数列表可以有默认参数