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

 #include <iostream>

 using namespace std;
class alloc { }; template<class T, class Alloc = alloc>
class vector {
public:
void swap(vector<T, Alloc>&) {
cout << "swap()" << endl;
}
}; template<class T,class Alloc>
inline void swap(vector<T, Alloc>& x,vector<T, Alloc>& y){
x.swap(y);
} int main(int argc, char **argv) {
vector<int> x,y;
swap(x,y);
return ;
}

以下用于验证class template内能否在有template

 #include <iostream>

 using namespace std;
class alloc { }; template<class T, class Alloc = alloc>
class vector {
public:
typedef T value_type;
typedef value_type* iterator;
  //测试class template内能否再有template
template<class I>
void insert(iterator position, I first, I last) {
cout << "insert()" << endl;
}
}; int main(int argc, char **argv) {
int ia[] = { , , , , }; vector<int> x;
vector<int>::iterator ite;
x.insert(ite, ia, ia + );
return ;
}

测试template参数可否根据前一个template参数而设定默认值

 #include <iostream>
#include <cstddef> using namespace std; class alloc { }; template<class T, class Alloc = alloc, size_t BufSiz = >
class deque {
public:
deque() {
cout << "deque" << endl;
}
}; template<class T, class Sequence = deque<T>>
class stack {
public:
stack() {
cout << "stack" << endl;
}
private:
Sequence c;
}; int main(int argc, char **argv) {
stack<int> x;
return ;
}

运行结果:

deque
stack

先成员变量构造,再构造函数。

//注释说测试class template可否拥有non-type template参数

//但是我没找到哪个是non-type

 #include <iostream>
#include <cstddef> using namespace std; class alloc { }; inline size_t __deque_buf_size(size_t n, size_t sz) {
return n != ? n : (sz < ? size_t( / sz) : size_t());
} template<class T, class Ref, class Ptr, size_t BufSiz>
struct __deque_iterator {
typedef __deque_iterator <T, T&, T*, BufSiz> iterator;
typedef __deque_iterator <T, const T&, const T*, BufSiz> const_iterator;
static size_t buffer_size() {
return __deque_buf_size(BufSiz, sizeof(T));
}
}; template<class T, class Alloc = alloc, size_t BufSiz = >
class deque {
public:
typedef __deque_iterator <T, T&, T*, BufSiz> iterator;
}; int main(int argc, char **argv) {
cout << deque<int>::iterator::buffer_size() << endl;
cout << deque<int, alloc, >::iterator::buffer_size() << endl;
return ;
}

运行结果

128
64

看过完整的STL代码,只觉得这样写很牛逼,但是不知道为什么要这样写。

查了下non-type原来指BufSize。但其实还是没弄懂定义的iterator有什么优秀之处

//bound friend templates 等着找到使用的地方

 #include <iostream>
#include <cstddef> using namespace std; class alloc { }; template<class T, class Alloc = alloc, size_t BufSiz = >
class deque {
public:
deque() {
cout << "deque" << ' ';
}
}; template<class T, class Sequence>
class stack; template<class T, class Sequence>
bool operator==(const stack<T, Sequence>& x, const stack<T, Sequence>& y); template<class T, class Sequence>
bool operator<(const stack<T, Sequence>& x, const stack<T, Sequence>&y); template<class T, class Sequence = deque<T>>
class stack {
//这个可以
/*
friend bool operator==<T>(const stack<T, Sequence>& x,
const stack<T, Sequence>& y);
friend bool operator< <T>(const stack<T, Sequence>& x,
const stack<T, Sequence>& y);
*/
//这个不可以
/*
friend bool operator==(const stack<T, Sequence>& x,
const stack<T, Sequence>& y);
friend bool operator<(const stack<T, Sequence>& x,
const stack<T, Sequence>& y);
*/
//操作符后不能去掉<>
//参数的<>可以去掉
friend bool operator==<T, Sequence>(const stack& x,
const stack<T, Sequence>& y);
friend bool operator< <>(const stack<T>& x, const stack<T, Sequence>& y);
public:
stack() {
cout << "stack" << endl;
}
private:
Sequence c;
}; template<class T, class Sequence>
bool operator==(const stack<T, Sequence>& x, const stack<T, Sequence>& y) {
cout << "operator==" << '\t';
return ;
} template<class T, class Sequence>
bool operator<(const stack<T, Sequence>& x, const stack<T, Sequence>&y) {
cout << "operator<" << '\t';
return ;
} int main(int argc, char **argv) {
stack<int> x;
stack<int> y; cout << (x == y) << endl;
cout << (x < y) << endl;
return ;
}

explicit specialization(显示特化)

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

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

原来偏特化就是C++ template一些体悟(2)写的东西,换了个名字,那里叫特殊设计

还涉及到 A a();是声明一个函数而非对象的问题,引以为戒

 #include <iostream>
#include <cstddef> using namespace std; #define __STL_TEMPLATE_NULL template<> template<class Key>
class Hash {
public:
Hash() {
cout << "Construct Hash<T>" << endl;
} void operator()() {
cout << "Hash<T>" << endl;
}
}; //explicit specialization
__STL_TEMPLATE_NULL
class Hash<char> {
public:
Hash() {
cout << "Construct Hash<char>" << endl;
}
void operator()() {
cout << "Hash<char" << endl;
}
}; int main(int argc, char **argv) {
// Hash<long> obj1(); //声明了一个函数而非对象
Hash<long> obj1;
Hash<char> obj2;
obj1();
obj2();
return ;
}

运行结果

Construct Hash<T>
Construct Hash<char>
Hash<T>
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. Java对象clone()的测试

    Object中自带native clone()方法. 研究了一下用法. public class DeepCopyTest { public static void main(String[] arg ...

  2. build/temp.linux-x86_64-2.7/_openssl.c:493:30: fatal error: openssl/opensslv.h: No such file or directory

    解决:apt-get install libssl-dev apt install python-dev(这个可能和那个错误关系不大)

  3. ERP行业内幕看了这五个问题全懂了

    ERP系统是现代企业实现信息化管理的必经之路.但很多管理人员或已经在用ERP的人员,其实并不太懂ERP系统是什么意思,有哪些好处等,导致实际使用过程中经常大材小用,或者“英雄无用武之地”.所以,为了更 ...

  4. Java多线程之通过标识关闭线程

    package org.study2.javabase.ThreadsDemo.status; /** * @Auther:GongXingRui * @Date:2018/9/19 * @Descr ...

  5. 一、VScode构建.NET应用程序

    一.准备工具 1.安装.NET SDK(软件开发工具包) https://microsoft.com/net/core 2.安装VScode并安装 3.安装VS Code C# extension(即 ...

  6. AutoCAD Civil 3D多版本插件安装包制作

      程序的主要界面如下: 图1 图2 图3 图4   安装包使用Installshield 2016完成.   其中图3是重点,可以选择需要安装的版本,此功能的实现,主要是依靠Installshiel ...

  7. Vue——服务器上部署vue.js

    服务器版本 [root@izuf63g0jydq42k49eo7zcz ~]# uname -a Linux izuf63g0jydq42k49eo7zcz -.el7.x86_64 # SMP Tu ...

  8. LOJ2250 [ZJOI2017] 仙人掌【树形DP】【DFS树】

    题目分析: 不难注意到仙人掌边可以删掉.在森林中考虑树形DP. 题目中说边不能重复,但我们可以在结束后没覆盖的边覆盖一个重复边,不改变方案数. 接着将所有的边接到当前点,然后每两个方案可以任意拼接.然 ...

  9. 【UOJ347】【WC2018】通道 边分治 虚树 DP

    题目大意 给你三棵树,点数都是\(n\).求 \[ \max_{i,j}d_1(i,j)+d_2(i,j)+d_3(i,j) \] 其中\(d_k(i,j)\)是在第\(k\)棵数中\(i,j\)两点 ...

  10. bzoj 2653: middle (主席树+二分)

    2653: middle Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2522  Solved: 1434[Submit][Status][Disc ...