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技法的更多相关文章

  1. 带你深入理解STL之迭代器和Traits技法

    在开始讲迭代器之前,先列举几个例子,由浅入深的来理解一下为什么要设计迭代器. //对于int类的求和函数 int sum(int *a , int n) { int sum = 0 ; for (in ...

  2. STL源代码剖析(二) - 迭代器与traits技法

    提要 先看一段用迭代器的代码: int a[] = {1, 2, 3, 4, 5}; vector<int> v1( a, a+5); vector<int>::iterato ...

  3. C++ traits技法的一点理解

    为了更好的理解traits技法.我们一步一步的深入.先从实际写代码的过程中我们遇到诸如下面伪码说起. template< typename T,typename B> void (T a, ...

  4. 转:PHP 5.4中的traits

    原文来自于:http://www.cnblogs.com/thinksasa/archive/2013/05/16/3081247.html PHP 5.4中的traits,是新引入的特性,中文还真不 ...

  5. PHP 5.4 中的traits

    PHP 5.4中的traits,是新引入的特性,中文还真不知道如何准确翻译好.其实际的目的,是为了有的场合想用多继承,但PHP又没多继承,于是就发明了这样的一个东西. Traits (横向重用/多重继 ...

  6. 如何在 PHP 和 Laravel 中使用 Traits

    事实上,PHP 作为一门编程语言存在的问题之一,就是你只能使用单继承.这意味着一个类只能从另一个类中继承.例如,可能希望从几个不同的类继承方法,以防止代码重复.在 PHP 5.4 中 一个新的语言特性 ...

  7. STL中的Traits编程技法

    最近在看读<STL源码剖析>,看到Traits编程技法这节时,不禁感慨STL源码作者的创新能力.那么什么是Traits编程技法呢?且听我娓娓道来: 我们知道容器的许多操作都是通过迭代器展开 ...

  8. PHP中的Traits用法详解

    PHP是单继承的语言,在PHP 5.4 Traits出现之前,PHP的类无法同时从两个基类继承属性或方法.php的Traits和Go语言的组合功能有点类似, 通过在类中使用use关键字声明要组合的Tr ...

  9. PHP中的traits快速入门

    traits 在学习PHP的过程中,我们经常会翻阅PHP的官方手册.一般理解能力强悍的人多阅读几遍便可轻松理解其中要领,但往往更多的初学者对官方文档中寥寥数语的描述难以理解.作为一个曾有同样困扰的人, ...

随机推荐

  1. mysql 赋给用户权限 grant all privileges on

    遇到了 SQLException: access denied for  @'localhost' (using password: no) 解决办法   grant all privileges o ...

  2. JavaScript 中实现继承的方式(列举3种在前一章,我们曾经讲解过创建类的最好方式是用构造函数定义属性,用原型定义方法。)

    第一种:对象冒充 function ClassA(sColor) { this.color = sColor; this.sayColor = function () { alert(this.col ...

  3. CSS实现单行、多行文本溢出显示省略号

    单行显示省略号 overflow: hidden; text-overflow:ellipsis; white-space: nowrap;多行显示省略号 display: -webkit-box; ...

  4. 转载:org.apache.catalina.util.DefaultAnnotationProcessor cannot be cast to org.apache.Annotation

    转载:org.apache.catalina.util.DefaultAnnotationProcessor cannot be cast to org.apache.Annotation (2012 ...

  5. 用Quick Cocos2dx做一个连连看(二)

    今天完成了以下内容: 1 成对生成SpriteItem 2 重排接口制作完成 3 SpriteItem的选择逻辑 主要代码如下: function MainScene:onEnter() local ...

  6. Ubuntu Apache2 配置简单介绍

    debian系列的(如Ubuntu,本人是Ubuntu 12.04的)Apache 通过 apt-get 方式安装的是 Apache2 的,是 httpd 的 2.x 版本,名字直接叫 apache2 ...

  7. (简单) POJ 2502 Subway,Dijkstra。

    Description You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. Instead of ...

  8. Keil C 里面Lib库文件的生成与调用

    源:Keil C 里面Lib库文件的生成与调用

  9. ucos调度器详解

    这一片谈谈关于ucos调度器的相关知识. ucos的调度器的实现主要靠一个函数OS_Sched 该函数将调度器的行为分为了两个部分,第一是调度部分,第二是任务切换部分,如下 void  OS_Sche ...

  10. thinkphp所有参数配置

    /* 项目设定 */ 'APP_DEBUG' => false, // 是否开启调试模式 'APP_DOMAIN_DEPLOY' => false, // 是否使用独立域名部署项目 'AP ...