C++初阶---array forward_list 模板进阶

Posted 4nc414g0n

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++初阶---array forward_list 模板进阶相关的知识,希望对你有一定的参考价值。

arrary

静态数组
注意:

  1. 浮点数类对象以及字符串不允许作为非类型模板参数的
  2. 非类型的模板参数必须在编译期就能确认结果

在32位Linux下栈很小只有8MB
不建议使用:如果数据量过大会造成栈溢出
对比vevtor:vector只有12byte地址在栈上,开辟的空间都在堆上
参考:array


forward_list

单向链表
注意forward_list无尾插尾删
参考:forwa_list


模板的特化

概念:在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。模板特化中分为函数模板特化与类模板特化

1.函数模板特化

模板的匹配原则:(引入)
例:

template<class T>
bool IsEqual(const T& left, const T& right)

	return left == right;

bool IsEqual(const char* const & left,const char* const & right)
//bool IsEqual(const char* left, const char* right)
// 函数模板的特化 (针对某些类型的特殊化处理)

	return strcmp(left, right) == 0;

int main()

	cout << IsEqual(1, 2) << endl;
	char p1[] = "dfddf";
	char p2[] = "dfsdf";
	cout << IsEqual(p1, p2) << endl;;
	return 0;

注意

  1. (const char* const & left,const char* const & right) ‘*’前面的const修饰的是*left,’*'后面的const才是修饰的left本身,而传入的形参p1,p2是数组名具有const属性 , 写为这样不能识别(const char*& left, const char*& right)
  2. 不能在bool IsEqual(const T& left, const T& right)内用if(T==const char*) return strcmp(left, right) == 0;
    不支持T==const char*此语法

函数模板特化

template<>
bool IsEqual<const char* const>(const char* const &left, const char* const &right)

	return strcmp(left, right) == 0;

注意

  1. 函数模板只能全特化不能偏特化
  2. 函数模版的全特化版本不参与函数重载解析,并且优先级低于函数基础模版参与匹配
  3. 一般情况下如果函数模板遇到不能处理或者处理有误的类型,为了实现简单通常都是将该函数直接给出

2.类模板特化

①全特化

template<class T1, class T2>
class Data

public:
	Data() cout<<"Data<T1, T2>" <<endl;
private:
	T1 _d1;
	T2 _d2;
;
template<>
class Data<int, char>

public:
	Data() cout<<"Data<int, char>" <<endl;
private:
	int _d1;
	char _d2;
;

Data<int, int> d1;
Data<int, char> d2;

②偏特化

  1. 部分特化
// 将第二个参数特化为int
template <class T1>
class Data<T1, int>

public:
	Data() cout<<"Data<T1, int>" <<endl;
private:
	T1 _d1;
	int _d2;
;
  1. 参数进一步限制
//两个参数偏特化为指针类型
template <typename T1, typename T2>
class Data <T1*, T2*>

public:
	Data() cout<<"Data<T1*, T2*>" <<endl;
private:
	T1 _d1;
	T2 _d2;
;
//两个参数偏特化为引用类型
template <typename T1, typename T2>
class Data <T1&, T2&>

public:
	Data(const T1& d1, const T2& d2)
	: _d1(d1)
	, _d2(d2)
	
		cout<<"Data<T1&, T2&>" <<endl;
	
private:
	const T1 & _d1;
	const T2 & _d2;
;
Data<int *, int*> d3; // 调用特化的指针版本
Data<int&, int&> d4(1, 2); // 调用特化的指针版本

模板分离编译

以上是关于C++初阶---array forward_list 模板进阶的主要内容,如果未能解决你的问题,请参考以下文章

C++初阶:模板初阶函数模板 | 类模板

C++初阶:模板初阶函数模板 | 类模板

C++初阶vector(中)

C++初阶vector(中)

C++初阶vector(中)

Java初阶Array详解(上)