c++ template(10)类型函数
一.sizeof模板化
#include <stddef.h> #include <iostream>template <typename T> class TypeSize {public:static size_t const value = sizeof(T); };int main() {std::cout << "TypeSize<int>::value = "<< TypeSize<int>::value << std::endl; }
二.获取容器元素类型
#include <vector> #include <list> #include <stack> #include <iostream> #include <typeinfo>template <typename T> class ElementT; // primary templatetemplate <typename T> class ElementT<std::vector<T> > { // partial specializationpublic:typedef T Type; };template <typename T> class ElementT<std::list<T> > { // partial specializationpublic:typedef T Type; };template <typename T> class ElementT<std::stack<T> > { // partial specializationpublic:typedef T Type; };template <typename T> void print_element_type (T const & c) {std::cout << "Container of "<< typeid(typename ElementT<T>::Type).name()<< " elements.\n"; }int main() {std::stack<bool> s;print_element_type(s); }
通过定义一个内部变量来简化上述工作
template <typename C> class ElementT { public: typedef typename C::value_type Type; };
标准库都定义了这样的类型
std::cout << "Container of "<< typeid( std::stack<bool>::value_type).name()<< " elements.\n";
通过此方法来简化模板参数数量.
原先原型:
template <typename T, typename C> T sum_of_elements (C const& c);
利用上面的内部type简化参数数量
template<typename C> typename ElementT<C>::Type sum_of_elements (C const& c);
三.确定一个对象是否是类类型
参考:http://www.cnblogs.com/mightofcode/archive/2013/04/07/3005849.html
#include <iostream>template<typename T> class IsClassT {typedef char _One;typedef struct{char a[2];}_Two;template<typename T>static _One isClass(int T::* p);template<typename T>static _Two isClass(...); public:enum { Yes = sizeof(isClass<T>(NULL))==sizeof(_One) };enum { No = !Yes };};class MyClass { }; struct MyStruct { }; union MyUnion { }; void myfunc() { } enum{e1}e; // check by passing type as template argument template <typename T> void check() { if (IsClassT<T>::Yes) { std::cout << " IsClassT " << std::endl; } else { std::cout << " !IsClassT " << std::endl; } } template <typename C> class ElementT { public: typedef typename C::value_type Type; }; // check by passing type as function call argument template <typename T> void checkT (T) { check<T>(); } int main() { std::cout << "int: "; check<int>(); std::cout << "MyClass: "; check<MyClass>(); std::cout << "MyStruct:"; MyStruct s; checkT(s); std::cout << "MyUnion: "; check<MyUnion>(); std::cout << "enum: "; checkT(e); std::cout << "myfunc():"; checkT(myfunc); }
四.引用和限定符
incr 函数将会使apply模板函数演绎成T&& arg,需要注意这点
#include <iostream> template <typename T> void apply (T& arg, void (*func)(T)) { func(arg); } void incr (int& a) { ++a; } void print (int a) { std::cout << a << std::endl; } int main() { int x=7; apply (x, print); //error//apply (x, incr); }
五.IfThenElse模板
用一个布尔值和特化技术来选择类型
template<bool C, typename Ta, typename Tb> class IfThenElse; // partial specialization: true yields second argument template<typename Ta, typename Tb> class IfThenElse<true, Ta, Tb> { public: typedef Ta ResultT; }; // partial specialization: false yields third argument template<typename Ta, typename Tb> class IfThenElse<false, Ta, Tb> { public: typedef Tb ResultT; };
c++ template(10)类型函数相关推荐
- Template 基础篇-函数模板
====================================================|| 欢迎讨论技术的可以相互加微信:windgs (请备注csdn+xx职业) ======== ...
- cron表达式 每天0点10分和30分_“提前2小时下班”:学会这10个函数,办公效率提升了10倍!...
✎ 大家好,我是雅客. 今天给大家分享10个非常好用的函数,这几个函数都是我们精挑细选出来的,掌握这些函数,可以帮你提升10倍的工作效率,从此下班提前2个小时不是梦想! 01 VLOOKUP函数 根据 ...
- 巨蟒python全栈开发-第10天 函数进阶
一.今日主要内容总览(重点) 1.动态传参(重点) *,** *: 形参:聚合 位置参数*=>元组 关键字**=>字典 实参:打散 列表,字符串,元组=>* 字典=>** 形参 ...
- C语言-第10章-函数
文章目录 10.0 导入例子 10.1 函数基础 10.1.1 函数的定义.调用 10.1.2 定义和调用没有返回值的函数或者没有输入的函数 10.1.3 return语句 10.1.4 函数的嵌套调 ...
- oracle输入数字类型吗,PL/SQL Number数字类型函数
PL/SQL Number数字类型函数 更新时间:2007年03月21日 00:00:00 作者: ABS(x) 函数,此函数用来返回一个数的绝对值. ACOS(x)函数,返回X的反余弦值.X范围 ...
- 8.10 exec函数
8.10 exec函数 用fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序.当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其m a i n函数开始执行.因 ...
- 【Kotlin】函数类型 ( 函数类型 | 带参数名称的参数列表 | 可空函数类型 | 复杂函数类型 | 带接收者函数类型 | 函数类型别名 | 函数类型实例化 | 函数调用 )
文章目录 I . 函数类型 II . 带参数名的参数列表 III . 可空函数类型 IV . 复杂函数类型解读 V . 函数类型别名 VI . 带 接收者类型 的函数类型 VII . 函数类型实例化 ...
- 时间转化_Excel常见时间日期函数全讲解,10个函数教你如何进行日期转化
在工作中我们经常会碰到一些需要转化或者计算时间日期的工作,这里就需要我们用到一些常见的Excel时间日期函数.今天我们就通过十个案例来教大家,如何在实际工作中对时间日期进行转化处理. 函数一.显示当前 ...
- (篇十)用结构体数组处理学生成绩、结构体类型函数求平均值
文章目录 一.结构体变量 二.用结构体数组处理学生成绩 三.结构体类型函数求平均值 用C语言学好结构化编程逻辑!本篇主要分析结构体数组和结构体类型的函数,对于二级C语言来说,主要是考处理学生多个成绩上 ...
最新文章
- java qq音乐接口 api,QQ音乐解析API接口更新:支持HQ,ape,flac无损音质,缓存功能
- [C#.NET 拾遗补漏]09:数据标注与数据校验
- android4.0.3去掉底部状态栏statusbar,全屏显示示例代码
- 【Python】体育竞技分析
- 蚂蚁技术专家:一篇文章带你学习分布式事务
- 【Spring】Spring Security OAuth2 JWT 认证
- icmp协议_计算机网络基础(七)网络层ICMP协议
- 2492 上帝造题的七分钟 2
- 海马玩模拟器无法链接问题处理
- springboot+vue公务员考试信息管理系统java
- java 基础的数组 添加
- 商务统计_4 用图表演示数据 - 频数分布
- ff15测试软件翻译,最终幻想15数据详细分析 FF15详细的数值参数测试
- 每日一学 | 2021-05-18 | Power BI 学习笔记00、01、02
- 一文读懂Uniswap V2的改进与创新
- java古典兔子问题(java50道经典编程题)
- python读取微信群信息_利用Python转发微信群通知信息
- vue 和nodejs是什么关系?
- TFS淘宝分布式文件核心存储引擎源码架构剖析实现
- java实现rar格式,java解压缩文件的实现示例,支持rar和zip格式