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
原创粉丝点击