#include<iostream>
#include<string>
#define someNastyWidget 128
class Widget
{
public:
Widget(std::string name = "default", std::size_t size = 0) :sname(name), ssize(size)
{
}
Widget(std::size_t size=0):sname("default"),ssize(size)
{
}
virtual ~Widget()
{
}
void print() const {
std::cout <<"sname:"<< sname << " ssize:" << ssize << std::endl;
}
std::size_t size() const {
return ssize;
}
virtual void normalize(){
sname = "====" + sname + "===";
ssize /= ssize;
}
void swap(Widget&other) {
std::swap(this->sname, other.sname);
std::swap(this->ssize, other.ssize);
}
bool operator!=(const Widget other) const {
return (this->sname != other.sname);
}
private:
std::string sname;
std::size_t ssize;
};
template<typename T>
void doProcessing(T & w)
{
if (w.size() > 10 && w != someNastyWidget)
{
T temp(w);
temp.normalize();
temp.swap(w);
}
}
int main()
{
Widget wg0("fffff", 20);
doProcessing(wg0);
wg0.print();
Widget wg1("fffff", 5);
wg1.print();
}
1)请记住,class 和templates都支持接口(interfaces)和多态。
2)对于class而言,接口是显式的,以函数签名为中心,多态则是通过virtual函数发生于运行期。
3)对于template参数而言,接口是隐式的,基于有效的表达式,多态则是通过template具体化和函数重载解析发生于编译期。
当我们写:
template<class T> class Widget;
template<typename T> calss Widget;
其中,class与typename没有什么不同。