STL 源码分析之萃取器

在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();

}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值