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的官方手册.一般理解能力强悍的人多阅读几遍便可轻松理解其中要领,但往往更多的初学者对官方文档中寥寥数语的描述难以理解.作为一个曾有同样困扰的人, ...
随机推荐
- iOS开发——GCDAsyncSocket
新进的这家公司搞智能家居,就随便整理一下其相关技术吧!首先,从GCDAsyncSocket的使用问题着手. 正如名称一样GCDAsyncSocket开源类库是以苹果的GCD多任务处理机制完成的一个异步 ...
- 强制删除sql用户链接
SELECT 'alter system kill session '''||sid||','||serial#||''';' FROM v$session WHERE username='USER' ...
- MFC中的NMHDR结构体和NMUPDOWN结构体
建立spin控件,创建UDN_DELTAPOS一个消息函数后: void CSpinDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult) { NM ...
- XPath语法
XPath 是XML 的查询语言,和SQL 的角色很类似.以下面XML 为例,介绍XPath 的语法 <?xml version="1.0" encoding="I ...
- The 2014 ACMICPC Asia Invitational Xian
上半年邀请赛的时候真是险而又险地2题拿了个铜,确实其实跟没拿一样......现场前复盘一下,长长记性 [A]签到题 [B]最短路+DFS [C]最短路 [D]构造+欧拉回路 [E]数论,最佳平方逼近 ...
- Mybatis 示例之 Association - 偶尔记一下 - 博客频道 - CSDN.NET
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- 全文搜索之 Elasticsearch
概述 Elasticsearch (ES)是一个基于 Lucene 的开源搜索引擎,它不但稳定.可靠.快速,而且也具有良好的水平扩展能力,是专门为分布式环境设计的. 特性 安装方便:没有其他依赖,下载 ...
- 《算法导论》Problem 2-4 Inversions
在Merge Sort的基础上改改就好了. public class Inversions { public static int inversions(int [] A,int p, int r) ...
- Keil STM32调试,使用ST-Link下载程序时提示“flash timeout.reset the target and try it again”
参考: 很郁闷,买来没多久的 STM32F4-DISCOVERY 就挂了? STM32F103RB Jlink调试的时候出现flash timeout.reset the target and t ...
- IOS9提示“不受信任的开发者”如何处理
iPhone升级到IOS9版本后,发现部分APP在下载后首次运行时,都会提示“不受信任的应用程序开发者”,这是因为企业证书发布的APP,没有经过AppStore审核,于是iOS对用户做出一个安全性的提 ...