template <typename T>class Blob{public:Blob();Blob(std::initializer_list<T> i);};
int main(){Blob<int> ia;Blob<int> ia2 = { 1,2,3 };Blob<double>* ia4 = new Blob<double>{ 1.1,3.14 };Blob<string> ia3 = { "Hello","World" };
return 0;}
template <typename T>class Blob{public:Blob();Blob(std::initializer_list<T> i);T func(T const &str);//在类内声明};
//类外定义template <typename T>T Blob<T>::func(T const &str){ }
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(std::make_shared<std::vector<T>>(b,e)){
}int main(){vector<long> vi = { 0,1,2 };list<const char*> w = { "Hello","World" };
Blob<int> a1(vi.begin(), vi.end());Blob<string> a2(w.begin(), w.end());return 0;}
template <typename T> class BlobPtr;template <typename T> class Blob;template <typename T>bool operator==(const Blob<T>&, const Blob<T>&){
}
template <typename T> class Blob{friend class BlobPtr<T>; //使BlobPtr模板类成为Blob模板类的友元friend bool operator==(const Blob<T>&, const Blob<T>&);//使operator函数成为Blob模板类的友元};
template <typename T> class BlobPtr{};
template <typename T> class Pal;
class C{friend class Pal<C>; //用类C实例化的Pal是C的友元
template <typename T> friend class Pal2; //Pal2的所有实例都是C的友元};
template <typename T> class C2{friend class Pal<T>; //与C2相同类型的实例化Pal才是C2的友元
template <typename X> friend class Pal2;//任何类型实例化的Pal2对象都是C2的友元,因为模板参数列表不同
friend class Pal3;//Pal3是一个非模板类,它是所有类型C2实例化的友元};
template <typename T> class Foo{public:static std : size_t count() { return ctr; }private:static std::size_t ctr;};
template <typename T>std::size_t Foo<T>::ctr = 0; //定义并初始化
Foo<int> fi; //实例化Foo<int>类和static数据成员ctrauto ct=Foo<int>::count();//实例化Foo<int>::countct=fi.count(); //使用Foo<int>::count,与上面的意义是相同ct=Foo::count(); //错误,Foo没有指出使用哪个模板实例化
Foo<int> f1,f2,f3; //f1,f2,f3共享Foo<int>::count()和Foo<int>::str
string::size_type //编译器知道我们要访问string类中的size_type数据类型
//编译器不知道size_type是一个static数据成员还是一种数据类型,因此产生二义性T::size_type * p;
template<typename T>typename T::value_type top(const T&c){ if (!c.empty()) return c.back(); else return typename T::value_type();}
//函数对象类,对给定指针执行deleteclass DebugDelete{public:DebugDelete(std::ostream &s=std::cerr):os(s){} //构造函数 //根据传入的参数进行deletetemplate <typename T>void operator()(T* p)const //成员模板{os << "deleting unique_ptr" << endl;delete p;}private:std::ostream &os;};
int main(){double *p = new double;DebugDelete d;d(p); //调用DebugDelete::operator()(double*)释放p
int *ip = new int;DebugDelete()(ip); //在一个临时DebugDelete对象上调用operator()(int*)
return 0;}
int main(){//一个类型为int的unique_ptr对象,DebugDelete作为其删除器unique_ptr<int, DebugDelete> p(new int, DebugDelete());
//一个类型为string的unique_ptr对象,DebugDelete作为其删除器unique_ptr<std::string, DebugDelete> sp(new std::string, DebugDelete());
return 0;}
template<typename T>class Blob {public:template<typename It>Blob(It b, It e); //构造函数接受一个迭代器区间,用来初始化dataprivate:std::vector<T> data;};