函数模板

今天学习了函数模板。主要从一下11个小知识点讲的。

1.函数模板

    1.1模板的编译
1.1.1 定义点  编译模板头部
1.1.2 调用点  编译模板的模板体

2.模板的实例化
3.模板函数
4.模板的实参推演
4.1 不能产生二义性
4.2 能够推演  要有实参
5.模板的特例化(专用化)
5.1 部分特例化
5.2 完全特例化
函数模板 只支持完全特例化
类模板  不仅支持完全特例化 还支持部分特例化
模板特例化版本要实现和实例化相同的逻辑
6.模板类型参数

7.模板的非类型参数

非类型参数
1.是常量

2.不能是float double

template<typename T, int SIZE>
void Print(T* arr)
{
	for (int i = 0; i < SIZE; ++i)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}
template<typename T = float,typename E = double,
		typename A = int>
E Count(T a, T b, A c)
{
	return a + b + c;
}

int main()
{
	/*
		自适应的调节类型
	*/
	auto rt = Count<int>(10, 10.1, 30);


	int arr[] = { 564, 1, 324, 561, 231, 32, 5 };
	Print<int, sizeof(arr) / sizeof(arr[0])>(arr);

	return 0;
}

8.模板的默认值
C++11::函数模板的默认值
类模板的默认值
9.接收不明确类型的返回值

10.模板的重载

普通函数版本、模板版本、模板特化版本
        在同时有以上三种类型的版本时,优先级如下:

1.普通函数版本  ==》2.模板的特化版本 ==》3.模板版本

bool Compare(char* a, char* b)
{
	cout << "Compare(char*,char*)" << endl;
	return strcmp(a, b) > 0;
}
template<typename T>
bool Compare(T a, T b)
{
	cout << "template<T> Compare(T,T) :"<< typeid(T).name() << endl;
	return a > b;
}

template<>
bool Compare<char*>(char* a, char* b)
{
	cout << "template<char*> Compare(char*, char*)" << endl;
	return strcmp(a, b) > 0;
}

int main()
{
	
	char* p = "hello";
	char* q = "world";
	Compare<>(p,q);  //普通函数版本
	Compare<>("hello","world"); //因为字符串为const char* ,普通函数没有,特化也没有,所以为模板版本

	return 0;
}

11.模板的隐式实例化,显式实例化
#pragma warning(disable:4996);
template<typename T>
T Sum(T a, T b)
{
	return a + b;
}
template<typename T>bool Compare(const T a, const T b){
	cout << "template<typename T>" << endl;
	cout << "type:" << typeid(T).name() << endl;
	return a > b;
}
template<>
bool Compare<char*>(char* const a,char* const b)
{
	cout << "template<>" << endl;
	return strcmp(a, b) > 0;
}



int main()
{
	Compare(10, 20);
	Compare<int>(20, 30);
	Compare<char*>("hello", "world");
	Add(10, 20.1);
	/*
		--模板的实例化
	*/
	Sum<int>(10, 20);
	Sum<double>(20.1, 30.1);
	
	Sum<char*>("hello", "world");
	//Get()
 
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值