traits class技术(条款47)
来源:互联网 发布:淘宝购物车营销工具 编辑:程序博客网 时间:2024/05/22 13:12
现在假设有以下这种情况
class A{public:A(){ }~ A(){}void f(){printf("A");}};class B{public:B(){}~ B(){}void f(){printf("B");}};class C{public:C(){}~ C(){}void d(){printf("C");}};
假设有上面这些类,其中A和B的执行动作相同,但是我们无法确认用户会调用那个类,因此我们无法写出以下这样的函数
template<class T> void f(T t){t.f();}
为什么?因为万一传递进来的是类C呢?为了解决这个问题我们必须这样写
void f(A a){a.f();}void f(B b){b.f();}void f(C c){c.d();}
但是在这个例子中A和B的执行动作是一样的,而只有C不一样,万一有非常多个类似A和B这样子的类,那岂不是要写N个重复的代码?为了解决这个问题我们可以使用traits技术,所谓的traits技术其实就是把执行相同动作的类归为同一类,用某个标志定义,这样根据这个标志就可以把相同类型的类定义为同一种类型,下面是示例代码
#include <typeinfo>#include <stdio.h>//定义两种类型#define type1 A #define type2 Bclass A{public:A(){ }~ A(){}void f(){printf("A");}public:class iterator_traits{public:typedef type1 iterator_category;};private:};class C{public:C(){ }~ C(){}void f(){printf("C");}public:class iterator_traits{public:typedef type1 iterator_category;};private:};class B{public:B(){}~ B(){}void f(){printf("B");}public:class iterator_traits{public:typedef type2 iterator_category;};private:};template<class T> void f(T t, type1){t.f();}template<class T> void f(T t,type2){t.f();}int main(){A a;B b;C c;f(a,A::iterator_traits::iterator_category()); //调用的时候记得加上括号 f(b,B::iterator_traits::iterator_category());f(c,C::iterator_traits::iterator_category());while(1);}
0 0
- traits class技术(条款47)
- traits:Traits技术初探
- traits:Traits技术初探
- traits:Traits技术初探
- traits:Traits技术初探
- traits:Traits技术初探
- traits:Traits技术初探
- 条款47:请使用traits classes表现类型信息(1)
- 条款47:请使用traits classes表现类型信息(2)
- 条款47:请使用traits classes表现类型信息
- Effective C++ 条款 47:使用traits classes表现类型信息
- 条款47:请使用traits classes 表现类型信息
- Traits技术
- Traits技术
- Traits 技术
- Traits技术
- traits:Traits技术学习笔记
- C++之traits(萃取技术)
- java面向对象的基本原则
- 行为型模式(二)
- 面向对象
- Python的线程和进程
- 辗转取余法求最大公倍数及最小公约数
- traits class技术(条款47)
- 代码大全学习笔记之表驱动法
- js object 转字符串
- 初识MKNetworkKit
- iOS开发之UIScrollView
- 关于图中节点间的概率求解问题-1
- 消息传递机制——block
- 约瑟夫问题。
- 组合模式(Composite)