博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++ template(10)类型函数
阅读量:7157 次
发布时间:2019-06-29

本文共 3123 字,大约阅读时间需要 10 分钟。

 

一.sizeof模板化

#include 
#include
template
class TypeSize { public: static size_t const value = sizeof(T);};int main(){ std::cout << "TypeSize
::value = " << TypeSize
::value << std::endl;}

二.获取容器元素类型

 

#include 
#include
#include
#include
#include
template
class ElementT; // primary templatetemplate
class ElementT
> { // partial specialization public: typedef T Type;};template
class ElementT
> { // partial specialization public: typedef T Type;};template
class ElementT
> { // partial specialization public: typedef T Type;};template
void print_element_type (T const & c){ std::cout << "Container of " << typeid(typename ElementT
::Type).name() << " elements.\n";}int main(){ std::stack
s; print_element_type(s);}

通过定义一个内部变量来简化上述工作

 

template 
class ElementT { public: typedef typename C::value_type Type; };

标准库都定义了这样的类型

std::cout << "Container of "    << typeid( std::stack
::value_type).name() << " elements.\n";

通过此方法来简化模板参数数量.

原先原型:

template 
T sum_of_elements (C const& c);

利用上面的内部type简化参数数量

template
typename ElementT
::Type sum_of_elements (C const& c);

三.确定一个对象是否是类类型

参考:

#include 
template
class IsClassT{ typedef char _One; typedef struct{
char a[2];}_Two; template
static _One isClass(int T::* p); template
static _Two isClass(...);public: enum { Yes = sizeof(isClass
(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
void check() { if (IsClassT
::Yes) { std::cout << " IsClassT " << std::endl; } else { std::cout << " !IsClassT " << std::endl; } } template
class ElementT { public: typedef typename C::value_type Type; }; // check by passing type as function call argument template
void checkT (T) { check
(); } int main() { std::cout << "int: "; check
(); std::cout << "MyClass: "; check
(); std::cout << "MyStruct:"; MyStruct s; checkT(s); std::cout << "MyUnion: "; check
(); std::cout << "enum: "; checkT(e); std::cout << "myfunc():"; checkT(myfunc); }

四.引用和限定符

incr 函数将会使apply模板函数演绎成T&& arg,需要注意这点

#include 
template
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
class IfThenElse; // partial specialization: true yields second argument template
class IfThenElse
{ public: typedef Ta ResultT; }; // partial specialization: false yields third argument template
class IfThenElse
{ public: typedef Tb ResultT; };

转载地址:http://nmhgl.baihongyu.com/

你可能感兴趣的文章
在Linux系统中创建SSH服务器别名
查看>>
【JMS 4】spring 整合activemq
查看>>
PDF文档页码怎么设置
查看>>
java单例模式
查看>>
多线程基础 (八)NSOperation相关
查看>>
【已解决】PHP项目需求:在现有网站中每个页面增加一个get参数
查看>>
Linux下安装oracle10g全解
查看>>
软件分层思想
查看>>
JAVA测试实际代码多少行,注释多少行,空格多少行?
查看>>
css与css3对比
查看>>
day7-select Port multiplexing, multiple IO
查看>>
查看哪些用户登录了ftp服务器
查看>>
学习Nagios(1)监控门禁
查看>>
30个优秀的大自然风格网页设计作品欣赏
查看>>
Touch事件传递顺序。
查看>>
用ipset配置linux防火墙
查看>>
phpmyadmin中提示“缺少mysqli扩展,请检查PHP设置”
查看>>
js 点击事件处理
查看>>
我的友情链接
查看>>
TeamViewerPortable远程桌面连接软件使用
查看>>