C++ traits技术

1、技术的发明是为了某个问题,traits也是一样。考虑下面的需求。
2、对两个变量相加,为了通用,使用模板方法,实现编译时多态。如下:
template <typename T>
T Add(T a,T b)
{
//...
}
3、对于int,double实现是一样的,直接相加就行了。但是对于char*,我们期望内容相加,返回一个新的指针。传统的解决办法使用方法过载,如下:
int Add(int a, int b);
double Add(double a, double b);
char* Add(char* a, char* b);
4、对于方法模板,存在问题,方法模板就是为了生成方法的,这里的T 可以是int,double,char*,根据模板实参具现化。这里要解决一个问题,方法模板根据不同的类型,生成不同的方法,也就是说过载方法模板,需要有一个形参表示类型的特性,比如int,char*,根据这个特性生成相应的方法,如下:
struct BaseType{};
struct CharPoint{};

// 对于基本类型,生成相应的方法
template <typename T>
T Do_Add(T a,T b,BaseType)
{
T c = a+b;
return c;
}

// 对于char指针,生成相应的方法
template <typename T>
T Do_Add(T a,T b,CharPoint)
{
// 这里存在安全隐患,要求调用者释放内存
T c = new char[strlen(a)+strlen(b)+1];
memset(c,0,strlen(a)+strlen(b)+1);
memcpy(c,a,strlen(a));
memcpy(c+strlen(a),b,strlen(b));

return c;
}
这里的BaseType和CharPoint是无名形参,因为并不使用这个形参,他们的目的只是为了让编译器生成不同的方法。

5、这里要解决一个问题,对于int和double,提取出BaseType,对于char*,提取出 CharPoint。怎么解决这个问题?
使用一个模板类,专门提取特性,默认提取出 BaseType,对于特殊的char* 使用偏特化提取出 CharPoint。所谓偏特化,就是缩小模板形参的范围,设计出一个特化的版本。也算就是说,对于大范围,默认有一个处理方式,在大范围中划出一个小范围,进行特殊处理。
如下:
template <typename T>
struct MyTraits
{
typedef BaseType value_type;
};

template <>
struct MyTraits<char*>
{
typedef CharPoint value_type;
};

6、接下来就看方法模板的实现,先使用traits 提取出特性,在调用方法,根据这个特性,生成不同的方法。如下:
template <typename T>
T Add(T a,T b)
{
typename MyTraits<T>::value_type type;
return Do_Add(a,b,type);
}
7、测试如下:
int main(int argc, char* argv[])
{
int a = 4;
int b = 7;
int c = Add(a,b);

char* pa = "abc";
char* pb = "123";
char* pc = Add(pa,pb);

return 0;
}

转载于:https://www.cnblogs.com/nzbbody/p/4621805.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值