第三章学习笔记:
1.类模板 和函数模板很相似的
template <typename T>
class stack{
};
注:那么这个类的类型是stack<T> 一些对赋值,拷贝构造函数等要像这样
template <template T》
class stack{
stack(stack<T> const&);
stack<T>& operator=(stack<T> const&);
};
stack<T>& stack(stack<T>::operator=(stack<T> const&){
}
当然,用类名而不是类的类型的时候,就只要stack即可。
2.类的成员函数实现 指定成员函数是一个函数模板 就需要使用该类模板的完整类型限定符 故要这样写:
template <typename T>
void stack(stack<T>::pop(){
}
模板类的参数是模板类类型,那么唯一要求是两个靠在一起的 '>' 之间 留一个空格.
stack<stack<int> >
错误写法: stack<stack<int>> 编译器会认为>> 会编译错误。
3.类模板的特化
① 和函数模板的重载类似,优化基于某种类型 实现。。。
② 要特化一个类模板, 还要特化该类的所有成员函数。
特化例子:
template<>
class stack<std::string>{
}
进行类模板的转化时,每个成员函数 重新定义为普通函数。特化后的话,使用的话不变吧?
函数也可以单独特化:
#include <iostream>
#include <string>
#include <algorithm>
template<typename value_t>
value_t const& max(value_t const& valueA, value_t const& valueB){
std::cout << "generic template used. ";
return valueA > valueB ? valueA :valueB;
}
template<>
std::string const & max<std::string>(std::string const & s1, std::string const & s2){ // the point!
std::cout << "specified template used ^_^. ";
std::string s1Temp(s1);
std::string s2Temp(s2);
std::transform(s1Temp.begin(), s1Temp.end(), s1Temp.begin(), tolower);
std::transform(s2Temp.begin(), s2Temp.end(), s2Temp.begin(), tolower);
return s1Temp > s2Temp ? s1 : s2;
}
template<>
int const & max<int>(int const& s1, int const& s2){ // the point!
std::cout << "AAA ";
return s1 > s2 ? s1 : s2;
}
int main(){
try{
//std::string s1(getUserInput("A"));
//std::string s2(getUserInput("B"));
std::string s1(("aaa"));
std::string s2(("BBB"));
std::cout << "the bigger is:" << ::max(1, 2);
}
catch(...){ std::cerr << "\n*** exception ! ***\n";}
return 0;
}
红色代码要注意 函数模板里的参数类型 和 特化的函数类型格式要一样俄。否则会还是用函数模板要实例化出函数代码的。 不会使用已经特化的。
4.局部转化:
如:template <typename T1, typename T2>
class myclass<T1*, T2*>{
};
貌似这个模板局部特化在VC6.0是不支持的。
与C++普通函数的缺省方式是一样一样的。这些缺省值还可引用之前的模板参数
如:
template <typename T, typename CONT=std::vector<T> >
小结:
参看原文。
第四章学习笔记:
非类型模板参数:
限制有点多,具体是:
非类型模板的参数里有限制:不能是浮点数和类对象。
通常只能是:常整数 或 指向外部(extern)对象的指针
PDF电子书下载地址:http://download.youkuaiyun.com/detail/helihui123/3719798