《深入实践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设备驱动程序 之 信号量和互斥体
概念 一个信号量本质是一个整数值,它和一堆函数联合使用,这一对函数通常称为P和V:希望进入临界区的进程将在相关信号量上调用P:如果信号量的值大于零,则该值会减少1,进程可以继续执行:相反,如果信号量的 ...
- Linux设备驱动程序 之 Makefile
典型的模块Makefile如下所示: ifneq ($(KERNELRELEASE),) obj-m := hello.o else KERNELDIR ?=/lib/modules/$(shell ...
- SRS之SrsTsContext::encode_pes详解
1. SrsTsContext::encode_pes 该函数位于 srs_kernel_ts.cpp 中.下面的分析基于假设当前要封装的消息是视频. /* * @msg: 要写入到 ts 文件中的音 ...
- Qt图形测绘窗口部件介绍
Qt 图形测绘窗口部件,主要使用第三方窗口部件: 1.Qwt:http://qwt.sourceforge.net 开源免费 2.GraphPak: http://www.ics.com 收费 3. ...
- 前端知识点回顾——Javascript篇(一)
DOM特殊元素获取 document.documentElement //HTML标签 document.head //head标签 document.title //title标签 document ...
- js 时间戳格式化日期格式
时间戳转换为日期,网上搜了好几个或多或少都有点问题,自己整理了一下,写了个方法 console.log(formatDate(1565280000000)) 输出: 2019-08-09 00:00: ...
- centos7 开启80端口
关闭与开启防火墙 systemctl stop firewalld.servicesystemctl start firewalld.service 先查看防火墙是否开启的状态,以及开放端口的情况:s ...
- python之crawlscrapy爬取某集团招聘信息以及招聘详情
针对这种招聘信息,使用crawlscrapy很适合. 1.settings.py # -*- coding: utf-8 -*- # Scrapy settings for gosuncn proje ...
- 图片滚动js代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...
- 配置了configuration.xml之后提示找不到映射关系
在启动类里面单独增加一个Bean即可解决 @Bean public DatabaseIdProvider getDatabaseIdProvider(){ DatabaseIdProvider dat ...