萃取(traits)



#include<iostream>
using namespace std;

template<class T>
struct MyIter
{
	typedef T value_type;//先声明一个内嵌类型
	T* ptr;
	MyIter(T *p):ptr(p)
	{}
	T& operator*()const
	{return *ptr;}
};
template<class I>
typename I::value_type func(I ite)//typename告诉编译器这是一个类型
{
	return *ite;	
}	
void main()
{
	MyIter<int> ite(new int(10));//ite是迭代器类型,T为int类型
	cout<<func(ite)<<endl;//可得I为迭代器类型,调用value_type(为int类型)则可返回int值
}

//并不是所有迭代器都是class type,struct type(自定义的类)这种类型,如果是int类型就不能为它定义一个内嵌类型
//但是STL绝对必须接受原生指针作为一个迭代器,因此上述这种做法是不够的,必须得对原生指针做出特殊化处理即模板的偏特化

class CInt
{
public:
	CInt()
	{
		for(int i = 0;i<10;i++)
		{
			value[i]=i+1;
		}
	}
	int GetSum()const
	{
		int sum = 0;
		for(int i=0;i<10;i++)
		{
			sum += value[i];
		}
		return sum;
	}
private:
	int value[10];
};

class CFloat
{
public:
	CFloat()
	{
		for(int i = 0;i<10;i++)
		{
			value[i]=i+1.01;
		}
	}
	float GetSum()const
	{
		float sum = 0.0f;
		for(int i=0;i<10;i++)
		{
			sum += value[i];
		}
		return sum;
	}
private:
	float value[10];
};

//萃取 (模板的特化)
template<class T>
struct NumTraits
{};

template<>
struct NumTraits<CInt>//对上面模板进行特化
{
	typedef int return_type;//return_type返回值类型名字必须一致
};
template<>
struct NumTraits<CFloat>//对上面模板进行特化
{
	typedef float return_type;//return_type返回值类型名字必须一致
};

///
template<class T>
class CApply
{
	//typename typedef NumTraits<T>::return_type return_type;
public:
	CApply(T &r):ref(r)
	{}
	/*
	int GetSum()const//结果只能返回整型,除非改变返回类型
	{
		return ref.GetSum();
	}*/
	typename NumTraits<T>::return_type GetSum()const//根据T来萃取return_type
	{return ref.GetSum();}
private:
	T &ref;
};
void main()
{
	CInt ci;
	CFloat cf;
	//cout<<ci.GetSum()<<endl;
	//cout<<cf.GetSum()<<endl;
	CApply<CFloat> ca(cf);
	cout<<ca.GetSum()<<endl;//结果返回整型?
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值