现在假设有以下这种情况
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 B
class 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);
}