《深入实践C++模板编程》之三——模板参数类型详解
- template<typename T>
- class CArray
- {
- static cosnt unsigned size = ;
- T elems[size];
- public:
- T& operator[](unsigned i) throw (std::out_of_range)
- {
- if (i >= size)
- {
- throw std::out_of_range("Access out of range\n");
- }
- else
- {
- return elems[i];
- }
- }
- };
- template<typename T, unsigned Size>
- class CArray2
- {
- T elems[Size];
- public:
- T& operator[](unsigned i) throw (std::out_of_range)
- {
- if (i >= size)
- {
- throw std::out_of_range("Access out of range\n");
- }
- else
- {
- return elems[i];
- }
- }
- };
- template<typename T, unsigned Size>
- class CArray2
- {
- public:
- CArray2()
- {
- id++;
- }
- ~CArray2(){}
- T elems[Size];
- public:
- T& operator[](unsigned i) throw (std::out_of_range)
- {
- if (i >= size)
- {
- throw std::out_of_range("Access out of range\n");
- }
- else
- {
- return elems[i];
- }
- }
- public:
- static int id;
- };
- template<typename T, unsigned Size> int CArray2<T, Size>::id = ; //顺便我们也应该了解这种带有非类型模板参数的模板类如何定义一个static成员
- void main()
- {
- CArray2<char, > array0;
- printf("ID:%d\n", array0.id);
- CArray2<char, > array1;
- printf("ID:%d\n", array1.id);
- CArray2<int, > array3;
- printf("ID:%d\n", array3.id);
- CArray2<int, > array4;
- printf("ID:%d\n", array4.id);
- getchar();
- }
- template<typename T, void(*f)(T &v)>
- void foreach(T array[], unsigned size)
- {
- for (unsigned i = ; i < size; ++i)
- {
- f(array[i]);
- }
- }
- template<typename T>
- void inc(T &v){ ++v; }
- template<typename T>
- void dec(T &v){ --v; }
- template<typename T>
- void print(T &v){ printf("%d ", v); }
- void main()
- {
- int array[] = { , , , , , , , };
- foreach<int, print<int>>(array, );
- foreach<int, inc<int>>(array, );
- getchar();
- }
- template<int* p>
- struct wrapper
- {
- int get(){ return *p; }
- void set(int v){ *p = v; }
- };
- template<int &p>
- struct wrapper2
- {
- int get(){ return p; }
- void set(int v){ p = v; }
- };
- int global_variable = ;
- int main()
- {
- wrapper<&global_variable> gwrapper;
- wrapper2<global_variable> gwrapper2;
- }
- template<int* p>
- struct wrapper
- {
- public:
- wrapper(){ id++; }
- int get(){ return *p; }
- void set(int v){ *p = v; }
- public:
- static int id;
- };
- template<int* p> int wrapper<p>::id = ;
- int global_variable = ;
- int global_variable3 = ;
- int main()
- {
- wrapper<&global_variable> gwrapper;
- printf("ID:%d\n", gwrapper.id);
- wrapper<&global_variable> gwrapper4;
- printf("ID:%d\n", gwrapper4.id);
- wrapper<&global_variable3> gwrapper3;
- printf("ID:%d\n", gwrapper3.id);
- getchar();
- }
- class some_value
- {
- int value;
- public:
- some_value(int _value) :value(_value){}
- int add_by(int op){ return value += op; }
- int sub_by(int op){ return value -= op; }
- int mul_by(int op){ return value *= op; }
- };
- typedef int (some_value::* some_value_mfp)(int);
- template<some_value_mfp func>
- int call(some_value &value, int op){ return (value.*func)(op); }//*是必要的,否则会认为是在使用value类的成员func
- void main()
- {
- some_value v0();
- printf("%d\n", call<&some_value::add_by>(v0, ));//&是必要的,否则会认为是调用some_value::add_by但是没给参数
- printf("%d\n", call<&some_value::sub_by>(v0, ));
- printf("%d\n", call<&some_value::mul_by>(v0, ));
- getchar();
- }
- template<typename T>
- struct inc
- {
- void operator()(T &v) const { ++v; }
- };
- template<typename T>
- struct dec
- {
- void operator()(T &v) const { --v; }
- };
- template<typename T>
- struct print
- {
- void operator()(T &v) const { std::cout << ' ' << v; }
- };
- template<template<typename TT> class Func, typename T>
- void foreach(T array[], unsigned size)
- {
- Func<T> func;
- for (unsigned i = ; i < size; i++)
- {
- func(array[i]);
- }
- }
- void main()
- {
- int array[] = { , , , , , , };
- foreach<print>(array, );
- foreach<inc>(array, );
- foreach<dec>(array, );
- getchar();
- }
《深入实践C++模板编程》之三——模板参数类型详解的更多相关文章
- VMware 虚拟化编程(2) — 虚拟磁盘文件类型详解
目录 目录 前文列表 虚拟磁盘文件 VMDK 用户可以创建的虚拟磁盘类型 VixDiskLib 中支持的虚拟磁盘类型 虚拟机文件类型 前文列表 VMware 虚拟化编程(1) - VMDK/VDDK/ ...
- VMware 虚拟化编程(7) — VixDiskLib 虚拟磁盘库详解之三
目录 目录 前文列表 VixDiskLib 虚拟磁盘库 VixDiskLib_GetMetadataKeys VixDiskLib_ReadMetadata 获取虚拟磁盘元数据 VixDiskLib_ ...
- VMware 虚拟化编程(5) — VixDiskLib 虚拟磁盘库详解之一
目录 目录 前文列表 VixDiskLib 虚拟磁盘库 虚拟磁盘数据的传输方式 Transport Methods VixDiskLib_ListTransportModes 枚举支持的传输模式 Vi ...
- VMware 虚拟化编程(6) — VixDiskLib 虚拟磁盘库详解之二
目录 目录 前文列表 VixDiskLib 虚拟磁盘库 VixDiskLib_Open 打开 VMDK File VixDiskLib_Read 读取 VMDK File 数据 VixDiskLib_ ...
- 2017.2.9 深入浅出MyBatis技术原理与实践-第八章 MyBatis-Spring(二)-----配置文件详解
深入浅出MyBatis技术原理与实践-第八章 MyBatis-Spring(二) ------配置文件详解 8.2 MyBatis-Spring应用 8.2.1 概述 本文主要讲述通过注解配置MyBa ...
- Scala 深入浅出实战经典 第62讲:Scala中上下文界定内幕中的隐式参数实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...
- Scala 深入浅出实战经典 第60讲:Scala中隐式参数实战详解以及在Spark中的应用源码解析
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- Java多线程编程中Future模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- Oracle GoldenGate中HANDLECOLLISIONS参数使用详解
Oracle GoldenGate中HANDLECOLLISIONS参数使用详解 HANDLECOLLISIONS 是一个 replicat 进程参数,主要在 initial load 中使用.在 ...
随机推荐
- 性能测试 | Linux线程数、进程查询
I. 最大值查询 1. 最大进程数查询 1 cat /proc/sys/kernel/pid_max 个人阿里云机器(单核2g)上输出如下 1 32768 2. 最大线程数查询 1 cat /proc ...
- Android通讯-webSocket
概述 上一篇简单的认识了Socket以及他的使用,在学习过程中看到了WebSocket的身影,于是乎百度了一把,这货也可以做全双工的网络通讯,而且是html5提出来的新东西!程序员嘛!就是要对新的东西 ...
- [转]MySQL查询语句执行过程详解
Mysql查询语句执行原理 数据库查询语句如何执行?语法分析:首先进行语法分析,对使用sql表示的查询进行语法分析,生成查询语法分析树.语义检查:检查sql中所涉及的对象以及是否在数据库中存在,用户是 ...
- Android关闭通知栏后toast无法提示的解决方案
https://github.com/getActivity/ToastUtils PS:release版本注意加上混淆规则
- 301跳转与URL转发有什么区别
在购买域名时,域名本身是不带有www的,但由于域名要通过DNS服务器解析后才可以使用,在这个过程中每一个域名是会指向一个web服务器ip地址,由于在很早之前网站方都会增加一个"www&quo ...
- RabbitMQ学习之:(十)AMQP和RabbitMQ介绍 (转贴+我的评论)
From: http://www.infoq.com/cn/articles/AMQP-RabbitMQ 准备开始 高级消息队列协议(AMQP1)是一个异步消息传递所使用的应用层协议规范.作为线路层协 ...
- Hadoop HDFS命令学习笔记
cat Usage: hadoop fs -cat [-ignoreCrc] URI [URI ...] Copies source paths to stdout. Options The -ign ...
- MATLAB学习(十)实现文件、图像读写
t=1:5; s1=sin(t); s2=cos(t); s=[t;s1;s2]; fid1=fopen('test.dat','wt'); fprintf(fid1,'\nThis is a For ...
- aws S3存储概念
S3存储(Simple Storage Service) 存储桶:存储桶是S3中用于存储对象的容器.每个对象都存储在一个存储桶中. 对象:对象是S3中存储的基本实体.对象由对象数据和元数据组成.数据部 ...
- DevOps - 微服务与Serverless
微服务 简介 "微服务"强调的是服务的大小,它关注的是某一个点. "微服务架构"则是一种架构思想,需要从整体上对软件系统进行通盘的考虑. 通俗来说,微服务架构就 ...