C++中的Traits技法
Traits广泛应用于标准程序库。Traits classes使得“类型相关信息”在编译期可用。
认真读完下面的示例,你应该就懂了Traits技法,其实并不难。
#include <bits/stdc++.h>
using namespace std;
//1,确认若干你希望将来可取得的类型相关信息
struct TypeOneTag {};
struct TypeTwoTag {};
struct TypeThreeTag: public TypeTwoTag {};
struct TypeFourTag: public TypeThreeTag {};
//2,在你将使用的类中为该信息选择一个名称
class ClassOne {
public:
typedef TypeOneTag TypeCategory;
};
class ClassTwo {
public:
typedef TypeTwoTag TypeCategory;
};
class ClassThree {
public:
typedef TypeThreeTag TypeCategory;
};
class ClassFour {
public:
typedef TypeFourTag TypeCategory;
};
//3,提供一个template和一组特化版本
template<typename T>
struct TypeTraits {
typedef typename T::TypeCategory TypeCategory;
};
template<typename T>
struct TypeTraits<T*> {
typedef TypeOneTag TypeCategory;
};
//4,建立一组重载函数(身份像劳工)或函数模板,彼此间的差异只在于各自的traits参数
void doSomething(TypeOneTag) {
cout << "TypeOneTag" << endl;
}
void doSomething(TypeTwoTag) {
cout << "TypeTwoTag" << endl;
}
void doSomething(TypeThreeTag) {
cout << "TypeThreeTag" << endl;
}
//5,建立一个控制函数(身份像工头)或函数模板,它调用上述那些“劳工函数”并传递traits class所提供的信息
template<typename T>
void test(T t) {
doSomething(typename TypeTraits<T>::TypeCategory());
}
//测试
int main(){
ClassOne one; test(one); //TypeOneTag
ClassTwo two; test(two); //TypeTwoTag
ClassThree three; test(three); //TypeThreeTag
ClassFour four; test(four); //TypeThreeTag,继承关系带来的一项红利,这也是public继承带来的部分好处
int *pointer; test(pointer); //TypeOneTag
return 0;
}
参考:《Effective C++》、《STL源码剖析》。
C++中的Traits技法的更多相关文章
- 带你深入理解STL之迭代器和Traits技法
在开始讲迭代器之前,先列举几个例子,由浅入深的来理解一下为什么要设计迭代器. //对于int类的求和函数 int sum(int *a , int n) { int sum = 0 ; for (in ...
- STL源代码剖析(二) - 迭代器与traits技法
提要 先看一段用迭代器的代码: int a[] = {1, 2, 3, 4, 5}; vector<int> v1( a, a+5); vector<int>::iterato ...
- C++ traits技法的一点理解
为了更好的理解traits技法.我们一步一步的深入.先从实际写代码的过程中我们遇到诸如下面伪码说起. template< typename T,typename B> void (T a, ...
- 转:PHP 5.4中的traits
原文来自于:http://www.cnblogs.com/thinksasa/archive/2013/05/16/3081247.html PHP 5.4中的traits,是新引入的特性,中文还真不 ...
- PHP 5.4 中的traits
PHP 5.4中的traits,是新引入的特性,中文还真不知道如何准确翻译好.其实际的目的,是为了有的场合想用多继承,但PHP又没多继承,于是就发明了这样的一个东西. Traits (横向重用/多重继 ...
- 如何在 PHP 和 Laravel 中使用 Traits
事实上,PHP 作为一门编程语言存在的问题之一,就是你只能使用单继承.这意味着一个类只能从另一个类中继承.例如,可能希望从几个不同的类继承方法,以防止代码重复.在 PHP 5.4 中 一个新的语言特性 ...
- STL中的Traits编程技法
最近在看读<STL源码剖析>,看到Traits编程技法这节时,不禁感慨STL源码作者的创新能力.那么什么是Traits编程技法呢?且听我娓娓道来: 我们知道容器的许多操作都是通过迭代器展开 ...
- PHP中的Traits用法详解
PHP是单继承的语言,在PHP 5.4 Traits出现之前,PHP的类无法同时从两个基类继承属性或方法.php的Traits和Go语言的组合功能有点类似, 通过在类中使用use关键字声明要组合的Tr ...
- PHP中的traits快速入门
traits 在学习PHP的过程中,我们经常会翻阅PHP的官方手册.一般理解能力强悍的人多阅读几遍便可轻松理解其中要领,但往往更多的初学者对官方文档中寥寥数语的描述难以理解.作为一个曾有同样困扰的人, ...
随机推荐
- BootStrap中关于input-group的问题(未解决)
****************************************2016年1月6日 23:08******************************* 本来想实现的如下功能: 但 ...
- [iOS]C语言技术视频-14-指针变量高级用法(函数指针)
下载地址: 链接: http://pan.baidu.com/s/1ykyg2 密码: fg5t
- jdk8 eclipse luna market crashed
THAT WORKS! Eclipse Luna starts normally when I first do the suggested: export SWT_GTK3=0 https://bu ...
- iOS之SDWebImage清理缓存
.找到 SDWebImage找到SDImageCache类 添加如下方法 - (float)checkTmpSize { float totalSize = 0; NSDirectoryEnumera ...
- Apache2 三种MPM对比分析
就最新版本的Web服务器Apache(版本是Apache 2.4.10,发布于2014年7月21日)来说,一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块)模式. ...
- Java对象嵌套
1.基础篇 Java面向对象东西太深奥了,本文只是发表一点自己的见解. 首先 举个栗子!! 汽车, 我们先给汽车定义个轮胎类 有一个属性名 轮胎尺寸 /** *定义一个轮胎类 */ class Wh ...
- MIPI-2
Mipi针对显示有一整套解决方案,首先,框图如下 可以看到,很像OSI七层参考模型,分为 应用层:像素处理以及像素包管理,处理一些比较高的协议, 协议层底层:用于对打包好的像素数据进行二次打包,包括对 ...
- objective-c之各种数值
各种数值 NSArray和NSDictionary都只能存储对象,不能存储任何基本类型的数据,如int,float,struct.因此我们可以用对象来封装基本的数值. NSNumber Cocoa提供 ...
- VB.Net隐式转换和显式转换的方法(转)
VB.Net隐式转换和显式转换的方法(转) “隐式转换”不需要源代码中的任何特殊语法.在下面的示例中,在将 k 的值赋给 q 之前,Visual Basic 将该值隐式转换成单精度浮点值. Dim ...
- MongoDB和MySQL的区别
http://www.cnblogs.com/caihuafeng/p/5494336.html MongoDB(文档型数据库):提供可扩展的高性能数据存储 一. 1.基于分布式文件存储 2.高负载情 ...