c/c++ 模板與STL小例子系列 traits 對這個概念,還是處於懵逼的狀態,初步體會就是,為瞭解決類型之間的轉換問題。 從一個類型為A的指針,轉化到類型為B的指針,中間需要用void 來作為中介。traits好像可以解決這種問題。 下麵弄了3個小例子,可以初步感受一下。 例子1: ...
c/c++ 模板與STL小例子系列<三> traits
對這個概念,還是處於懵逼的狀態,初步體會就是,為瞭解決類型之間的轉換問題。
從一個類型為A的指針,轉化到類型為B的指針,中間需要用void*來作為中介。traits好像可以解決這種問題。
通過traits技術,可以達到扔進去什麼類型,給我吐出什麼類型
扔進去的是int出來的t1也是int類型
Iterator_1<int>::value_type t1 = 100;
下麵弄了3個小例子,可以初步感受一下。
例子1:
#include <iostream>
using namespace std;
template<typename T, typename U>
class traits{
public:
typedef T value_type1;
typedef T& ref1;
typedef U value_type2;
typedef U& ref2;
};
template<typename TA, typename UA>
class A : public traits<TA, UA>
{
};
int main(){
A<int, double>::value_type1 a = 10;
A<int, double>::ref1 b = a;
cout << a << endl;
cout << b << endl;
A<int, double>::value_type2 a1 = 10.2;
A<int, double>::ref2 b1 = a1;
cout << a1 << endl;
cout << b1 << endl;
}
例子2:
#include <iostream>
using namespace std;
class Test1;
class Test2;
template<typename T>
class TypeTb1{};
template<>
class TypeTb1<Test1>{
public:
typedef char ret_type;
typedef int p1_type;
typedef double p2_type;
};
template<>
class TypeTb1<Test2>{
public:
typedef double ret_type;
typedef double p1_type;
typedef int p2_type;
};
template<typename T>
class Test{
public:
typename TypeTb1<T>::ret_type func(typename TypeTb1<T>::p1_t\
ype x,
typename TypeTb1<T>::p2_type y){
return x;
}
};
int main(){
Test<Test1> t;
cout << t.func(65, 6.18) << endl;
Test<Test2> t2;
cout << t2.func(6.18, 65) << endl;
}
例子3:
#include <iostream>
using namespace std;
class A{
public:
void show(){cout << "A show" << endl;}
};
template<typename T>
class Iterator_1{
public:
typedef T value_type;
typedef value_type* ptn;
typedef value_type& ref;
};
template<typename T>
class Iterator_2{
public:
typedef T value_type;
typedef value_type* ptn;
typedef value_type& ref;
};
template<typename T>
struct Traits{};
template<typename T>
struct Traits<T *>{
typedef T value_type;
typedef value_type* ptn;
typedef value_type& ref;
};
int main(){
Iterator_1<int>::value_type t1 = 100;
cout << t1 << endl;
Iterator_2<double>::value_type t2 = 1.23;
cout << t2 << endl;
Traits<double*>::value_type t3 = 4.45;
cout << t3 << endl;
Iterator_1<A>::ptn p;
p->show();
}