本文是在海贼班学习的一些笔记。
下面定义了一个模板类PRINT。注意:
1. PRINT是模板,PRINT<int>才是类的名字。我们必须将PRINT<int> 实例化成123后才能调用print(123)。
2. 我们可以看出print是被定义成了PRINT<int>。我们不能执行print<"hello">或print_int<"hello">来打印字符串。
3. PRINT<int>(789)是生成一个PRINT<int>类的对象,而不是调用operator()。而且我们还必须定义相应构造函数才行。
#include <iostream>
using namespace std;
template<typename T>
class PRINT {
public :
PRINT &operator()(T a) {
cout << a << endl;
return *this;
}
};
int main() {
PRINT<int> print; //跟模板函数不一样,这里必须声明类型
print(123);
print(456);
//PRINT<int>(789); //出错
PRINT<int> print_int;
print_int(123);
print_int(456);
//print("fwgew"); //出错
PRINT<string> print_string;
print_string("hello world");
print_string("haizei");
return 0;
}
采用下面的添加了转换构造函数和缺省构造函数后上面的PRINT<int>(789)就可以通过编译了。不过它只是生成一个PRINT<int>类的实例而已。
template<typename T>
class PRINT {
public :
PRINT() {}
PRINT(int a) {};
PRINT &operator()(T a) {
cout << a << endl;
return *this;
}
};
上面的方法有点繁琐,因为还得根据不同的类型来实例化不同的print函数(print_int, print_string)。那么有没有以不变应万变的方法呢?有的。
答案就是把template<typename T>这一行移到到operator()函数的上方即可。我们可以看出这个类的T实际上只对operator()起作用了。个人觉得,那么这个PRINT好像就不算模板类了,只是普通类里面包了一个模板函数而已。
#include <iostream>
using namespace std;
//template<typename T>
class PRINT {
public :
//PRINT() {}
//PRINT(int a) {};
template<typename T>
PRINT &operator()(T a) {
cout << a << endl;
return *this;
}
};
int main() {
PRINT print;
print(123);
print("hello world!");
print("123")("hello world!")("hello haizei");
return 0;
}
结果是
123
hello world!
123
hello world!
hello haizei