//成员模板
//成员模板:一个类(无论是普通类还是模板类)可以包含本身是模板的成员函数。
//成员模板不能是虚函数
//普通类的成员模板
class DebugDelete {
public:
DebugDelete(std::ostream &s = std::cerr) :os(s) {}
//与任何函数模板相同,T的类型由编译器推断
template<typename T> void opreator()(T *p)const
{
os << "delete ad" << endl;
delete p;
}
private:
std::ostream &os;
};
double *p = new double;
DebugDelete d;
d(p);//调用DebugDelete::opreator()(double*),释放p
int *ip = new int;
DebugDelete()(ip);//在一个临时对象上调用opreator()(int*)
//类模板的成员模板
template<typename T>
class Blob {
template<typename It>Blob(It b, It e);
};
//必须同时为类模板和成员模板提供模板参数列表
template<typename T>
template<typename It>
Blob<T>::Blob(It b, It e) :data(make_share<vector<T>>(b, e)) {}
int ia[] = { 1,2,3,4,5,6,7,8 };
vector<long> vi = { 1,2,3,4,5,6 };
Blob<int> a1(begin(ia), end(ia));
Blob<int> a2(vi.begin(), vi.end());