其实没啥体悟,因为还没有感受到这些例子的作用,记一下先
1 #include <iostream> 2 3 using namespace std; 4 class alloc { 5 6 }; 7 8 template<class T, class Alloc = alloc> 9 class vector { 10 public: 11 void swap(vector<T, Alloc>&) { 12 cout << "swap()" << endl; 13 } 14 }; 15 16 template<class T,class Alloc> 17 inline void swap(vector<T, Alloc>& x,vector<T, Alloc>& y){ 18 x.swap(y); 19 } 20 21 22 int main(int argc, char **argv) { 23 vector<int> x,y; 24 swap(x,y); 25 return 0; 26 }
以下用于验证class template内能否在有template
1 #include <iostream> 2 3 using namespace std; 4 class alloc { 5 6 }; 7 8 template<class T, class Alloc = alloc> 9 class vector { 10 public: 11 typedef T value_type; 12 typedef value_type* iterator; 13 //测试class template内能否再有template 14 template<class I> 15 void insert(iterator position, I first, I last) { 16 cout << "insert()" << endl; 17 } 18 }; 19 20 int main(int argc, char **argv) { 21 int ia[5] = { 0, 1, 2, 3, 4 }; 22 23 vector<int> x; 24 vector<int>::iterator ite; 25 x.insert(ite, ia, ia + 5); 26 return 0; 27 }
测试template参数可否根据前一个template参数而设定默认值
1 #include <iostream> 2 #include <cstddef> 3 4 using namespace std; 5 6 class alloc { 7 8 }; 9 10 template<class T, class Alloc = alloc, size_t BufSiz = 0> 11 class deque { 12 public: 13 deque() { 14 cout << "deque" << endl; 15 } 16 }; 17 18 template<class T, class Sequence = deque<T>> 19 class stack { 20 public: 21 stack() { 22 cout << "stack" << endl; 23 } 24 private: 25 Sequence c; 26 }; 27 28 int main(int argc, char **argv) { 29 stack<int> x; 30 return 0; 31 }
运行结果:
deque stack
先成员变量构造,再构造函数。
//注释说测试class template可否拥有non-type template参数
//但是我没找到哪个是non-type
1 #include <iostream> 2 #include <cstddef> 3 4 using namespace std; 5 6 class alloc { 7 8 }; 9 10 inline size_t __deque_buf_size(size_t n, size_t sz) { 11 return n != 0 ? n : (sz < 512 ? size_t(512 / sz) : size_t(1)); 12 } 13 14 template<class T, class Ref, class Ptr, size_t BufSiz> 15 struct __deque_iterator { 16 typedef __deque_iterator <T, T&, T*, BufSiz> iterator; 17 typedef __deque_iterator <T, const T&, const T*, BufSiz> const_iterator; 18 static size_t buffer_size() { 19 return __deque_buf_size(BufSiz, sizeof(T)); 20 } 21 }; 22 23 template<class T, class Alloc = alloc, size_t BufSiz = 0> 24 class deque { 25 public: 26 typedef __deque_iterator <T, T&, T*, BufSiz> iterator; 27 }; 28 29 int main(int argc, char **argv) { 30 cout << deque<int>::iterator::buffer_size() << endl; 31 cout << deque<int, alloc, 64>::iterator::buffer_size() << endl; 32 return 0; 33 }
运行结果
128 64
看过完整的STL代码,只觉得这样写很牛逼,但是不知道为什么要这样写。
查了下non-type原来指BufSize。但其实还是没弄懂定义的iterator有什么优秀之处
//bound friend templates 等着找到使用的地方
1 #include <iostream> 2 #include <cstddef> 3 4 using namespace std; 5 6 class alloc { 7 8 }; 9 10 template<class T, class Alloc = alloc, size_t BufSiz = 0> 11 class deque { 12 public: 13 deque() { 14 cout << "deque" << ' '; 15 } 16 }; 17 18 template<class T, class Sequence> 19 class stack; 20 21 template<class T, class Sequence> 22 bool operator==(const stack<T, Sequence>& x, const stack<T, Sequence>& y); 23 24 template<class T, class Sequence> 25 bool operator<(const stack<T, Sequence>& x, const stack<T, Sequence>&y); 26 27 template<class T, class Sequence = deque<T>> 28 class stack { 29 //这个可以 30 /* 31 friend bool operator==<T>(const stack<T, Sequence>& x, 32 const stack<T, Sequence>& y); 33 friend bool operator< <T>(const stack<T, Sequence>& x, 34 const stack<T, Sequence>& y); 35 */ 36 //这个不可以 37 /* 38 friend bool operator==(const stack<T, Sequence>& x, 39 const stack<T, Sequence>& y); 40 friend bool operator<(const stack<T, Sequence>& x, 41 const stack<T, Sequence>& y); 42 */ 43 //操作符后不能去掉<> 44 //参数的<>可以去掉 45 friend bool operator==<T, Sequence>(const stack& x, 46 const stack<T, Sequence>& y); 47 friend bool operator< <>(const stack<T>& x, const stack<T, Sequence>& y); 48 public: 49 stack() { 50 cout << "stack" << endl; 51 } 52 private: 53 Sequence c; 54 }; 55 56 template<class T, class Sequence> 57 bool operator==(const stack<T, Sequence>& x, const stack<T, Sequence>& y) { 58 cout << "operator==" << ' '; 59 return 1; 60 } 61 62 template<class T, class Sequence> 63 bool operator<(const stack<T, Sequence>& x, const stack<T, Sequence>&y) { 64 cout << "operator<" << ' '; 65 return 1; 66 } 67 68 int main(int argc, char **argv) { 69 stack<int> x; 70 stack<int> y; 71 72 cout << (x == y) << endl; 73 cout << (x < y) << endl; 74 return 0; 75 }
explicit specialization(显示特化)
还有个偏特化,可以了解一下
原来偏特化就是C++ template一些体悟(2)写的东西,换了个名字,那里叫特殊设计
还涉及到 A a();是声明一个函数而非对象的问题,引以为戒
1 #include <iostream> 2 #include <cstddef> 3 4 using namespace std; 5 6 #define __STL_TEMPLATE_NULL template<> 7 8 template<class Key> 9 class Hash { 10 public: 11 Hash() { 12 cout << "Construct Hash<T>" << endl; 13 } 14 15 void operator()() { 16 cout << "Hash<T>" << endl; 17 } 18 }; 19 20 //explicit specialization 21 __STL_TEMPLATE_NULL 22 class Hash<char> { 23 public: 24 Hash() { 25 cout << "Construct Hash<char>" << endl; 26 } 27 void operator()() { 28 cout << "Hash<char" << endl; 29 } 30 }; 31 32 int main(int argc, char **argv) { 33 // Hash<long> obj1(); //声明了一个函数而非对象 34 Hash<long> obj1; 35 Hash<char> obj2; 36 obj1(); 37 obj2(); 38 return 0; 39 }
运行结果
Construct Hash<T> Construct Hash<char> Hash<T> Hash<char