Tarits,特性的复数。c++萃取技术就是指它。实现方式是模板特化。
STL中涉及到iterator的地方经常能用到它。
gcc的STL与VS的STL略有差别。
vs中下列代码,把鼠标放在iterator上,按F12,找到别名定义,真实类型见注释
#include<vector>
using namespace std;
int main(){
vector<int> v;
vector<int>::iterator it=v.begin();// typedef _Vector_iterator< _Vector_val<_Ty, _Ax> > vector<_Tx,_Ty>::iterator;
return 0;
}
自己简单地实现了一下,见下面代码。
#include
using namespace std;
class IntArr{
private:
int a[5];
public:
IntArr(){
for(int i=0;i<5;i++)
a[i]=i;
}
int CalcFrontSum(int n){//计算数组前n个元素的和
int tmp=0;
for(int i=0;i
class NumTrait{};
template <> //模板特化
class NumTrait{
public :
typedef int intype;
typedef int resulttype;
};
template <>
class NumTrait{
public :
typedef int intype;
typedef float resulttype;
};
template
class TArr{
public:
float CalcFrontSum(T& obj,int n){
return obj.CalcFrontSum(n);
}
};
template
class TArrSuper{
public:
//typename 不能少,不然编译器会把NumTrait::resulttype默认当作一个变量来处理而不是一个类型
typename NumTrait::resulttype CalcFrontSum(T& obj,typename NumTrait::intype n){
return obj.CalcFrontSum(n);
}
};
template
class TArrSuper2{
private:
typedef typename NumTrait::resulttype resulttype;
typedef typename NumTrait::intype intype;
public:
resulttype CalcFrontSum(T& obj,intype n){
return obj.CalcFrontSum(n);
}
};
template
typename NumTrait::resulttype CalcFrontSum(T& obj,typename NumTrait::intype n){
return obj.CalcFrontSum(n);
}
int main(){
IntArr IntArrObj;
FloatArr FloatArrObj;
cout< TArrObj1;
TArrTArrObj2;
cout< TArrSuperObj1;
TArrSuperTArrSuperObj2;
cout< TArrSuper2Obj1;
TArrSuper2TArrSuper2Obj2;
cout<