Template 基础篇-类模板
Template所代表的泛型编程是C++语言中的重要的组成部分,我将通过几篇blog对这半年以来的学习做一个系统的总结,本文是基础篇的第二部分。
文章目录
类模板定义
类模板也是公共逻辑的抽象,通常用来作为容器(例如:vector)或者行为(例如:clonable)的封装。
类模板
下面定义了一个Printer类模板,负责打印以及转化为string。
template<typename T>
class Printer {
public:
explicit Printer(const T& param):t(param){
}
string&& to_string();
//定义在内部
void print() {
cout << t << endl;
}
private:
T t;
};
//定义在外部
template<typename T>
string&& Printer<T>::to_string() {
strstream ss;
ss << t;
return std::move(string(ss.str()));
}
Printer p(1); //error
Printer<int> p(1); //ok
与函数模板不同,类模板不能推断实例化。所以你只能显示指定类型参数使用Printer<int> p(1)
,而不能让编译器自行推断Printer p(1)
。
类模板的成员函数既可以定义在内部,也可以定义在外部。定义在内部的被隐式声明为inline,定义在外部的类名之前必须加上template的相关声明。
类模板中的成员函数模板
我们还可以把类模板和函数模板结合起来,定义一个含有成员函数模板的类模板。
template<typename T>
class Printer {
public:
explicit Printer(const T& param):t(param){
}
//成员函数模板
template<typename U>
void add_and_print(