Java/C# 中称为:泛型Generic
模板:模板有点像宏,模板允许定义一个可以根据你的用途进行编译的模板,可以让编译器基于规则帮你写代码,有点像C++的meta programming(元编程),游戏设计中日志系统和材质系统基本会用template模板。
MSVC编译器不会对你不适用的模板错误进行报错,如果没有调用模板的话,但是一些编译器比如Clang会报错,所以这是依赖编译器的。
不创建模板,函数重复重载:
#include <iostream>
#include <string>
void Print(int value) //函数重载
{
std::cout << value << std::endl;
}
void Print(float value) //函数重载
{
std::cout << value << std::endl;
}
void Print(std::string value) //函数重载
{
std::cout << value << std::endl;
}
int main()
{
Print(5);
Print("Hello");
Print(5.5f);
std::cin.get();
}
创建函数的模板:
#include <iostream>
#include <string>
template<typename T> //typename也可以写成class
void Print(T value) //输入参数类型不同,只有在调用的时候这个函数才被进行编译,才是运行的代码
{
std::cout << value << std::endl;
}
int main()
{
Print(5);
Print("Hello");
Print(5.5f);
Print<int>(5); //可以写<int>或者不写,编译器可以识别
std::cout << array.GetSize() << std::endl;
std::cin.get();
}
创建类的模板:
#include <iostream>
#include <string>
//在栈上创建array class,编译期模板会被评估处理
template<typename T, int N> // 两个模板参数
class Array
{
private:
T m_Array[N]; //栈分配的数组,在编译时就需要知道[]里的数字,可以使用alloca(动态分配栈内存)可以动态地增加内存
public:
int GetSize() const { return N; }
};
int main()
{
Array<int,5> array;
Array<std::string, 5> array;
std::cout << array.GetSize() << std::endl;
std::cin.get();
}