其实没啥体悟,因为还没有感受到这些例子的作用,记一下先

  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. int main(int argc, char **argv) {
  22. vector<int> x,y;
  23. swap(x,y);
  24. return ;
  25. }

以下用于验证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[] = { , , , , };
  22.  
  23. vector<int> x;
  24. vector<int>::iterator ite;
  25. x.insert(ite, ia, ia + );
  26. return ;
  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 = >
  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 ;
  31. }

运行结果:

  1. deque
  2. 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 != ? n : (sz < ? size_t( / sz) : size_t());
  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 = >
  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, >::iterator::buffer_size() << endl;
  32. return ;
  33. }

运行结果

  1. 128
  2. 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 = >
  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==" << '\t';
  59. return ;
  60. }
  61.  
  62. template<class T, class Sequence>
  63. bool operator<(const stack<T, Sequence>& x, const stack<T, Sequence>&y) {
  64. cout << "operator<" << '\t';
  65. return ;
  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 ;
  75. }

explicit specialization(显示特化)

还有个偏特化,可以了解一下

C++模板之特化与偏特化详解

原来偏特化就是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 ;
  39. }

运行结果

  1. Construct Hash<T>
  2. Construct Hash<char>
  3. Hash<T>
  4. Hash<char

C++ template一些体悟(3)的更多相关文章

  1. C++ template一些体悟(2)

    class template的一般化设计之外,特别针对某些参数做特殊设计 #include <iostream> using namespace std; //一般设计 template& ...

  2. C++ template一些体悟(1)

    #include <iostream> using namespace std; template<typename T> class testClass { public: ...

  3. 为.NET Core项目定义Item Template

    作为这个星球上最强大的IDE,Visual Studio不仅仅提供了很多原生的特性,更重要的是它是一个可定制的IDE,比如自定义Project Template和Item Template就是一个非常 ...

  4. jQuery.template.js 简单使用

    之前看了一篇文章<我们为什么要尝试前后端分离>,深有同感,并有了下面的评论: 我最近也和前端同事在讨论这个问题,比如有时候前端写好页面给后端了,然后后端把这些页面拆分成很多的 views, ...

  5. 2000条你应知的WPF小姿势 基础篇<69-73 WPF Freeze机制和Template>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  6. tornado template

    若果使用Tornado进行web开发可能会用到模板功能,页面继承,嵌套... 多页应用模板的处理多半依赖后端(SPA就可以动态加载局部视图),就算是RESTfull的API设计,也不妨碍同时提供部分模 ...

  7. 设计模式(九): 从醋溜土豆丝和清炒苦瓜中来学习"模板方法模式"(Template Method Pattern)

    今天是五.四青年节,祝大家节日快乐.看着今天这标题就有食欲,夏天到了,醋溜土豆丝和清炒苦瓜适合夏天吃,好吃不上火.这两道菜大部分人都应该吃过,特别是醋溜土豆丝,作为“鲁菜”的代表作之一更是为大众所熟知 ...

  8. C++泛型编程:template模板

    泛型编程就是以独立于任何特定类型的方式编写代码,而模板是C++泛型编程的基础. 所谓template,是针对“一个或多个尚未明确的类型”所编写的函数或类. 使用template时,可以显示的或隐示的将 ...

  9. 新手入门Underscore.js 中文(template)

    Underscore.js是一个很精干的库,压缩后只有4KB.它提供了几十种函数式编程的方法,弥补了标准库的不足,大大方便了javaScript的编程.MVC框架Backbone.js就将这个库作为自 ...

随机推荐

  1. k8s容器的资源限制

    1.k8s支持内存和cpu的限制 requests:容器运行需求,最低保障limits:限制,硬限制(资源上限) CPU: 1颗逻辑CPU(1核CPU=4个逻辑CPU) 1物理核=1000个微核(mi ...

  2. 老男孩python学习自修【第二天】字符串用法

    实时处理增量日志最佳实践 主要使用f.seek()和f.tell()实现 字符串处理函数: s.find(substr, start, end) 查找子字符串,找不到则返回-1,找到则返回对应的索引 ...

  3. initial

    摘自http://blog.csdn.net/liming0931/article/details/7039680 首先说说结构化过程语句,在verilog中有两种结构化的过程语句:initial语句 ...

  4. springmvc拦截器匹配规则

  5. Nginx 假如reload或reopen时发生错误如何解决

    配置Nginx 如果reload 或 quit发生不存在文件的时候 重新编译下即可  ./nginx -c /usr/local/webserver/nginx/conf/nginx.conf //重 ...

  6. AHOI(十二省联考)2019 退役记

    我也想退役失败.jpg Day 0 我才知道联考原来是4.5h? 下午居然还有讲题,感觉变得正规多了. 试机敲了LCT,NTT,SA,加起来花了大概40min,基本1A,感觉海星.键盘似乎有点过于灵敏 ...

  7. Matplotlib学习---用matplotlib画箱线图(boxplot)

    箱线图通过数据的四分位数来展示数据的分布情况.例如:数据的中心位置,数据间的离散程度,是否有异常值等. 把数据从小到大进行排列并等分成四份,第一分位数(Q1),第二分位数(Q2)和第三分位数(Q3)分 ...

  8. poj 2226 Muddy Fields(水二分图)

    Rain has pummeled the cows' field, a rectangular grid of R rows and C columns (1 <= R <= 50, 1 ...

  9. Hdoj 2717.Catch That Cow 题解

    Problem Description Farmer John has been informed of the location of a fugitive cow and wants to cat ...

  10. 【UOJ#236】[IOI2016]railroad(欧拉回路,最小生成树)

    [UOJ#236][IOI2016]railroad(欧拉回路,最小生成树) 题面 UOJ 题解 把速度看成点,给定的路段看成边,那么现在就有了若干边,然后现在要补上若干边,以及一条\([inf,\) ...