在STL中迭代器控制算法,算法操作容器。但是,泛型编程中算法并不知道迭代器传递给他的是什么样的类型,所以在迭代器和算法之间需要一个东西来分配类型。这东西就是萃取器。这是一种编程的技法。下面上图后直接上模拟的萃取器代码。并且说明原理。
下面上模拟代码。都备注好了。
#include<iostream>
using namespace std;
//先来写两个结构体。
struct A{};
struct B{};
//假设传入一个不知道是啥的类型
template<typename AorB>
struct unknown_class
{
typedef AorB retrun_type;
};
//正常版本的萃取器
template<typename unknown_class >
struct unknown_class_traits
{
typedef typename unknown_class::retrun_type return_type;
};
//指针特化
template<typename T>
struct unknown_class_traits<T*>
{
typedef T return_type;
};
//const指针特化版本
template <typename T>
struct unknown_class_traits<const T*>
{
typedef const T* return_type;
};
//萃取分配器
template <typename unknow_type>
inline typename unknown_class_traits<unknow_type>::return_type
return_type()
{
typedef typename unknown_class_traits<unknow_type>::return_type TP;
return TP();
};
// func作为共有接口
template <typename unknow_type>
inline typename unknown_class_traits<unknow_type>::return_type
func(unknow_type u)
{
typedef typename unknown_class_traits<unknow_type>::return_type return_type;
return _func(u, return_type());
}
//func的三个重载版本。为了区分起见,重载的版本叫_func();
template <typename unknow_type>
inline typename unknown_class_traits<unknow_type>::return_type
_func(unknow_type,A)
{
cout << "A OUT" << endl;
return A();
}
template <typename unknow_type>
inline typename unknown_class_traits<unknow_type>::return_type
_func(unknow_type,B)
{
cout << "B OUT" << endl;
return B();
}
template <typename unknow_type, typename T>
T
_func(unknow_type, T)
{
cout << "use origin ptr" << endl;
return T();
}
int main()
{
unknown_class<B> b;
unknown_class<A> a;
//unknown_class<int> i;
int value = 1;
int *p = &value;
A v1 = func(a);
B v2 = func(b);
int v3 = func(p);
char ch = getchar();
}