C++ 特化与偏特化

C++ 萃取技术:特化与偏特化。

在C++当中,可以通过模板来实现泛化到特化。过程为:泛化–>偏特化–>特化。

泛化模板类:满足于任意的U,V的模板类。

template<typename U,typename V> class TemClass{
	public:
		TemClass(){
			cout<<"泛化"<<endl;
		}
};

int main(void){
	TemClass<int,int> TC;//"泛化"
	return 0;
}

泛化模板函数:满足于任意的T1,T2的模板函数。

template<typename T1,typename T2> void Function1(const T1& t1,const T2& t2){
	cout<<"泛化"<<endl; 
}

int main(void){
	int a = 1,b = 1; 
	Function1<int,int>(a,b);//"泛化"
	return 0;
}

全特化模板类:基于泛化类。例子中代表仅仅对于满足<char,char>的情况。

template<typename U,typename V> class TemClass{
	public:
		TemClass(){
			cout<<"泛化"<<endl;
		}
};

template<> class TemClass<char,char>{
	public:
		TemClass(){
			cout<<"全特化"<<endl;
		}
};

int main(void){
	TemClass<char,char> TC;//"全特化"
	return 0;
}

全特化模板函数:

template<typename T1,typename T2> void Function1(const T1& t1,const T2& t2){
	cout<<"泛化"<<endl; 
}
template<> void Function1<char,char>(const char& t1,const char& t2){ 
	//注意:函数参数要和泛型模板函数对应
	cout<<"全特化"<<endl; 
} 
int main(void){
	char a ='A',b ='B';
	Function1<char,char>(a,b);//“全特化”
	return 0;
}

偏特化模板函数:例子中代表代表对于<X,int>对应的模板类。

template<typename U,typename V> class TemClass{
	public:
		TemClass(){
			cout<<"泛化"<<endl;
		}
};
template<typename X> class TemClass<X,int>{
	public:
		TemClass(){
			cout<<"偏特化"<<endl;
		}
};
int main(void){
	TemClass<char,int> TC;//“偏特化”
	return 0;
}

没有偏特化模板函数,重载可以解决偏特化模板函数的问题。
补充:
特化或者偏特化类当中的所有东西都是独立的。

模板类知识点补充:

模板有类型模板和非类型模板两种:
类型模板类似于template,T是一种泛型类型,例如char、int、string或是自定义的类型A。类型模板函数template void fun(T a),将T实例化为int那么参数a的类型就是int,实例化为A那么参数a的类型就是A。
非类型模板template同理,只不过它的泛型T不是类型而是int型常量,例如1、3、10。非类型模板的典型应用就是数组长度定义,众所周知int a[N]这种语句中N必须是一个编译期常量否则无法通过编译,要实现定义不同长度的数组,就可以使用template void foo(){double a[T]}这样的写法,调用foo时必须传递一个编译期常量如10,如foo<10>(),即可在函数foo中创建一个长度为10的double数组。

这也就可以解释迭代器源码当中的:

template<typename _Iterator,
	   bool = __has_iterator_category<_Iterator>::value>
    struct __iterator_traits { };

非类型模板+偏特化。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值