这两天看了<<STL源码解析>>,谈谈自己对traits的一点理解吧.
C++中类几类结构同时由一个父类派生出来,而他们都拥有一个设计接口上相同的属性,而在实现上却有细节上的不同.这时,为了在通用算法中将他们整合在一起,就产生了traits的设计,traits的汉语意思为特性.
举个例子,比如我们设计一个共同的属性叫value_type,对于不同的迭代器通用的一个属性.如vector_iterator<int>的value_type为int,vector_iterator<A>的value_type为A.
函数f1的参数要是一个value_type,可以利用模板,
template<typename T>
void f1(T t){
.........
}
利用模板参数t传到函数中去,但如果T的类型为const int,我们想传入一个int类型的参数时,这种方法也是不行的.
因此就产生了traits的设计,利用traits提供于特性的榨取.
比如,函数f1要返回一个value_type的对象.
template<class I>
struct test_list_iterator{
typedef I value_type;
value_type* pos;
value_type operator*(){
return *pos;
}
test_list_iterator(I* p){
this->pos=p;
}
};
struct test_list_iterator{
typedef I value_type;
value_type* pos;
value_type operator*(){
return *pos;
}
test_list_iterator(I* p){
this->pos=p;
}
};
我们设计一个简单的迭代器结构,用value_type来表示迭代器所指向值的类型.
为了对value_type进行榨取,我们设计了test_iteratora_traits
template<class I>
struct test_iterator_traits{
typedef typename I::value_type value_type;
};
struct test_iterator_traits{
typedef typename I::value_type value_type;
};
同时,由于简单类型int没有value_type的定义,const Type的value_type应该取成Type而不是const Type,因此,利且模板的偏特化,对test_iterator_traits进行偏特化.
//偏特化版本
template<class I>
struct test_iterator_traits<I*>{
typedef I value_type;
};
template<class I>
typename test_iterator_traits<I>::value_type
f(I ite){
return *ite;
}
template<class I>
struct test_iterator_traits<I*>{
typedef I value_type;
};
template<class I>
typename test_iterator_traits<I>::value_type
f(I ite){
return *ite;
}
假如函数f2要返回一个value_type的对象,如下:
template<class I>
typename test_iterator_traits<I>::value_type
f(I ite){
return *ite;
}
typename test_iterator_traits<I>::value_type
f(I ite){
return *ite;
}
测试的main函数如下:
int main(){
int a=1;
int* pa=&a;
test_list_iterator<int> ita(pa);
cout<<f(pa)<<endl;
cout<<f(ita)<<endl;
}
int a=1;
int* pa=&a;
test_list_iterator<int> ita(pa);
cout<<f(pa)<<endl;
cout<<f(ita)<<endl;
}
小人本潜水在思源的贴边 ID又多 又有钱 快活乐无边 谁知道站总监 他蛮横不留情面 他勾结站长目无天 占我ID夺我钱 我马甲跟他来翻脸 反被他来把经验减 我同学骂他欺新人 反被他捉进了小黑屋里面 874了一百遍啊一百遍 啊 最后他咬舌自尽 遗恨人间 他还将我和马甲赶出了思源 流落在人间 我为求回思源 无奈行乞在贴前 谁知道站总监他实在太阴险 知道此情形竟派人来暗算将我发文狂删到0篇 小人ID强 残命独留全 可怜马甲他 竟遭删 为求养ID 惟有傍人卖身自作践 一面苦赚钱 一面写诗篇 发誓把名气显 手刃总监意志坚啊 从此总监ID念心间 我永铭记此仇不供戴天 |