template 模板
观察以下代码:
void print(int a)
{
std::cout << a << std::endl;
}
void print(double a)
{
std::cout << a << std::endl;
}
void print(std::string a)
{
std::cout << a << std::endl;
}
int main()
{
print(2333);
print(23.3);
print("u got be kiding me!");
}
我们明显发现print()函数之间的差别只是传入的参数不同,但使用了三次重载来实现,这样的代码复用性低,被视为是垃圾代码,怎么优化呢?这时候我们引入template关键词来实现
template<typename T>
void print(T a)
{
std::cout << a << std::endl;
}
int main()
{
print(2333);
print(23.3);
print("u got be kiding me!");
}
以上操作实现了第一次编写代码的效果,所以我们可以理解为我们将a的类型变成了可变的量,让编译器自己去判断输入的数据属于什么类型。
并且在代码底层逻辑里,print函数并不是真正的函数,它只有在被调用时才会被创建出来以供使用。
当然,你也可以显式地表示函数的模板:
print<int>(2333);
注:将template< typename T >的typename替换成class是等效的,但是这么做容易与类相混淆,故不推荐
这是关于模板使用的另一个例子:
template<int N>
class Array
{
private:
int m_Array[N];
public:
int GetSize() const
{
return N;
}
};
int main()
{
Array<5> my_array;
std::cout<<my_array.GetSize(); //输出:5
}
还可以这样:
template<typename T,int N>
class Array
{
private:
T m_Array[N];
public:
int GetSize() const
{
return N;
}
};
int main()
{
Array < double , 5 > my_array;
}
这里的array实际上和C++标准库中提供的array十分相似.