c++基础之模板的全特化、偏特化

本文探讨了C++中的模板特化,包括类模板和函数模板的全特化与偏特化。通过实例展示了如何为特定类型提供定制化的实现,以优化性能。全特化为特定类型提供了完整实现,而偏特化则针对模板的部分类型进行特化。在实际应用中,偏特化主要应用于类模板,而函数模板仅支持全特化。
摘要由CSDN通过智能技术生成

模板为什么要特化,因为编译器认为,对于特定的类型,如果你能对某一功能更好的实现,那么就该听你的。

模板分为类模板与函数模板,特化分为全特化与偏特化。全特化就是限定死模板实现的具体类型,偏特化就是如果这个模板有多个类型,那么只限定其中的一部分。

1.类模板

template<typename T1,typename T2>
class Jack
{
private:
	T1 a;
	T2 b;
public:
	Jack(T1 x, T2 y) :a(x), b(y)
	{
		cout << "无特化 a:" << a << " b:" << b << endl;
	}

};

//偏特化
template<typename T>
class Jack<int,T>
{
private:
	int a;
	T b;
public:
	Jack(int x, T y) :a(x), b(y)
	{
		cout << "偏特化 a:" << a << " b:" << b << endl;
	}
};
//全特化
template<>
class Jack < int, double>
{
private:
	int a;
	double b;
public:
	Jack(int x, double y) :a(x), b(y)
	{
		cout << "全特化 a:" << a << " b:" << b << endl;
	}
};

void main()
{

	Jack<int, double> j1(1, 22.2);//全特化
	Jack<int, bool> j2(100, true);//偏特化
	Jack<double, int> j3(0.88, 200);//无特化

	system("pause");
}

结果:
在这里插入图片描述

2.函数模板

template<typename T1,typename T2>
void gogogo(T1 a, T2 b)
{

	cout << "无特化模板函数,a:" << a << " b:" << b << endl;
}

template<>
void gogogo(int a, double b)
{
	cout << "全特化模板函数,a:" << a << " b:" << b << endl;
}

template<typename T>
void gogogo(int a, T b)
{
	cout << "偏特化模板函数,a:" << a << " b:" << b << endl;
}


void main()
{
	gogogo<int,double>(100, 20.99);
	gogogo<int,bool>(1, true);
	gogogo(20.33333, 10086);
	system("pause");
}

结果:
在这里插入图片描述
从结果可以看出函数模板不能偏特化,只能全特化。
查了相关资料知道了为啥不能偏特化:
没有函数偏特化,仅仅是因为C++标准语言说不行(you can’t partially specialize them – pretty much just because the language says you can’t),另外我觉得有了函数重载,函数偏特化也没什么用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发如雪-ty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值