本系列属于长篇, 有兴趣的可以慢慢参看(源于读书笔记和各种资料整理)
解决模板, 主要为了 C++11 中的某些问题做个铺垫
在学习模板之前, 首先想到自己的一个问题, 有时候需要打印某些调试信息, 除了使用一些专业的 LOG 工具外, 一般情况下为了简单方便, 就直接使用 std::cout, 比如
- std::cout<<"参数 i="<<i<<std::endl;
- std::cout<<"消息值 ="<<msg<<std::endl;
每次写这么一行感觉特别多也烦琐, 就想着有没有一个函数, 能接受任意参数进行打印呢? 当时的想法是这样的,
- void g(参数...)
- {
std::cout<<参数<<std::endl;
}
调用的时候, 直接使用 g(实参)来调用, 这样就可以省了很多语句. 但是由于每种类型都不同, 如果要实现这种功能, 需要函数重载很多次, 那么有没有一种万能类型, 用一个函数对应所有可能呢?
此外, 还有一个经常喜欢使用的例子, 就是 max 函数, 用于比较两个值的大小, 由于类型的变化非常多, 那么有没有一个 max 能比较各种类型的大小呢? 比如:
- max(int,int);
- max(int,float);
- max(std::string,std::string);
- ....
这些问题统一归属于模板的应用
函数模板
首先说模板, 就像工厂的模具一样, 我们认为它是[虚] 的, 虚的概念在程序设计中也许是最高境界(也可以认为就是抽象), 虚可以对应一切. 例如, void *, 我记得从前有篇博客是这样写的, void * 就好比人, 而 int *,char * 等实际类型可以认为是男人和女人.
那么可以说, 男人和女人是人, 但是人不是男人和女人, 因此, int * 可以直接转化为 void*, 翻译过来就是男人是人. 这段表达让我一直以来记忆犹新, 写的非常棒.
回到模板, 模板也是一种虚的概念, 对于函数模板来说, 它代表一个函数家族. 也就是说, 一种类型可以泛化出各种类型. 这是函数模板的初步认识, 它是虚的.
函数模板形式
- template<typename T>
- bool max(const T &a,const T &b){
- return a> b ? true : false;
- }
来源: http://www.bubuko.com/infodetail-3319970.html