模板进阶(跑路人笔记)

本文介绍了C++中的非类型模板参数,它允许使用常量作为模板参数,但不支持浮点数、类对象和字符串。接着讲解了模板特化的概念,包括全特化和偏特化,用于针对特定类型提供特殊的函数或类实现。全特化是为所有模板参数指定特定值,而偏特化则仅对部分模板参数进行特化,例如针对特定类型组合或类型属性(如指针、引用)进行特化。
摘要由CSDN通过智能技术生成

非类型模板参数

模板形参分为两种

  1. 类型模板参数: 及跟在class或typename后面的参数类型名称

    image-20220725213900545

  2. 非类型模板参数: 就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用

    image-20220725213930865

    image-20220725214127291

这里的N是常数, 是可以作为数组的初始化长度的存在.

image-20220725214459634

注意:

  1. 浮点数, 类对象和字符串是不允许作为非类型模板参数的.
  2. 非类型模板参数必须在编译器就可以确定结果.

模板的特化

我们在使用模板的时候有可能需要对一些固定的类型做特殊处理不然会使代码出现问题.

比如我们实现一个less函数作为大小的比较.

image-20220725220107741

此时就需要对模板进行特化.

及针对特殊的类型进行特殊的函数实现操作.模板特化分为类模板特化 函数模板特化

其中函数模板特化 其实大部分都是可以通过实例化实现的方式来解决.

所以模板的特化我们一般用于类上面.

全特化

如有以下代码:

template<class T1,class T2>
class test
{
public:
	test()
	{
		cout << "test()T1 T2" << endl;
	}
};
template<>
class test<char,int>
{
public:
	test()
	{
		cout << "test()char int" << endl;
	}
};

int main()
{
	test<int, int>();
	test<char, int>();
	return 0;
}

image-20220725224613953

执行结果如上图:

这里我们的test类就通过特化实现了当类需要对如char int 类型进行的特殊化处理.

这种特化我们称为全特化.及将所有的模板参数进行了特化.

偏特化

如有以下代码:

template<class T1,class T2>
class test
{
public:
	test()
	{
		cout << "test()T1 T2" << endl;
	}
};

偏特化可以分为两种特化

  • 部分特化
template<class T1>
class test<T1 ,char>
{
public:
	test()
	{
		cout << "test()T1 char" << endl;
	}
};

如上代码就是将当T2类型为char的时候转入的.

  • 类型限制特化

我们也可以指定一种类型进行特化如指针,引用.

代码如下:

template<class T1, class T2>
class test<T1*,T2*>//指针的特化
{
public:
	test()
	{
		cout << "test()<T1*,T2*>" << endl;
	}
};
template<class T1, class T2>//引用类型的特化
class test<T1&, T2&>
{
public:
	test()
	{
		cout << "test<T1&, T2&>" << endl;
	}
};
template<class T1, class T2>//引用加指针
class test<T1&, T2*>
{
public:
	test()
	{
		cout << "test<T1&, T2*>" << endl;
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

就一个挺垃圾的跑路人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值