C++模板之函数模板
来源:互联网 发布:软件开发人员分工 编辑:程序博客网 时间:2024/05/03 08:12
C++中分为函数模板和类模板,它们之间的相同点是都含有模板型参表,不同点在模板实例化的时候函数模板可以不用显示的声明模板类项,编译器会自动帮我们匹配,而类模板则需要显示定义出来,例如:
template <class Type> compare(Type& , Type&); compare(a,b);
template <class Type> class Queue { ... } class<int> test;
1.函数模板中编译器帮我们做了实例化的事情,那么它遵循的是什么规则呢?
首先,编译器首先考虑产生新的实例,而不是转化实参以匹配已有的实例化,以上 面compare为例:
int a1= 3,a2 = 4;
long b1 = 3,b2 = 4;
compare(a1,a2);
compare(b1,b2);
编译器首先实例化一个compare(int,int),当遇到b1,b2时,不会考虑对b1,b2进行类 项转化,而是又实例化了一个 compare(long,long).
但是也有例外,编译器会在以下两中情况下执行转化而不去产生新的类项:
1>. const转换,既你可以把非const类项对象的引用或指针传到接受const类项的函数中而不产生实例化,或者传递对象给接受非引用类项的函数时也不会产生实例化。
2>.数组或函数到指针的转化;
2.函数模板的显式实参
有时候我们不确定模板实参的类项,如:
template<class T,class U> ??? sum(T,U) ,我们想要返回T,U类项中范围最大的那个,该怎么办呢?
一种是指定显示模板参数,如sum(static_cast<int> short, int),既把小范围的给强制转换成范围大的类项。
还有一种是在返回类项中再使用类项行参,如:
template<class T,class U, class K> T sum(U,K);
long val = sum<long>(int ,long);
3.函数模板特化
有时候模板函数并不能帮我们解决所有问题,比如compare函数,当我想比较指向字符串的指针时,很显然我想比较的是字符串的字典序,而不是两个指针的大小,这个时候就需要我们用模板特化的技术了。
模板特化的格式是这样的:
template<> int compare<const char*> (const char* const , const char* const )
我的理解就是把模板参数列表从template移到了后面,同时模板特化是不支持类项转化的,传入的参数类项必须完全匹配,如果不匹配的化,它会去普通模板中查看是否能够实例化。
- 【C++】:C++之函数模板
- 模板之函数模板
- 模板之函数模板
- C++ STL之命名空间、函数模板、类模板
- C++模板之函数模板
- c++ 模板之函数模板
- c++模板之函数模板
- C++模板之函数模板
- 【c/c++】函数模板和模板函数
- C++Template学习笔记之函数模板
- [C++] C++小笔记之模板函数
- 用汇编的眼光看c++(之模板函数) ,(之缺省模板、特化模板) .
- C/C++:函数模板与类模板
- [C/C++]模板函数与模板类
- C/C++ 函数模板
- c++:函数模板
- 【C++】函数模板
- 【c++】函数模板
- 经典面试题:链表的相交与环问题
- 常用的正则表达式
- Gentoo 更改 openssh 版本信息(emerge 方式安装)
- 素数筛法
- C++Primer第三版0316习题
- C++模板之函数模板
- C语言实现责任链二通过配置文件改变处理逻辑
- Struts2体系原理图以及详解
- 安装wepp v0.4.0 用于 CSS合并 javascript合并
- iphone IOKit 遍历 IORegistryEntry,获取名称和属性
- 《设计模式解析》 第20章 来自设计模式的教益:各种工厂模式
- 矩阵的基本运算 ------ C 实现
- objective 字符转换
- android播放音乐的三种方法实现