C++模板--函数模板基本 说明
2017-12-19 16:05
246 查看
C++模板是个很重要的东西,但是现实中,我几乎没写过模板,几乎都快忘记这个东西,前两天学习了,意识到这个问题,主要是准备学习C++11,初步学习,举步维艰,发现不会模板学习有些费劲,觉得很难理解,所以今天来说明下函数模板最基本说明,其实模板挺复杂的,应该,我只看了一点都觉的很绕,还有很多坑,估计这个写本书没啥问题,我也只是记录基本程度的一点心得,
一 重要的规则:这一点很多资料能说出一堆,说的很多很细致,我来说几个比较重要的,
1.模板类型,推荐用typename,虽然效果等同于class,但是有些场合必须使用typename ,当然这个尤其是使用类模板时你会用的到,应该是成员函数模板(类模板还没开始学习呢)
2.指定的非类类型(不是class,基本类型比如int,double),只能使用int类型,template,其他类型不允许,(char貌似也是可以,某种程度的int,可能是这个原因吧)
这段代码放到VS2003下编译没问题,但Ubuntu,gcc5.4有问题,我记得使用VS2017也是不行的,这很可能是C++11已经不支持这个了,在VS2003下甚至可以f<5.5>(),但是C++11不支持,指针和引用都是可以的,如double*,
3 具体化类型要使用全局变量或者常量,这个涉及到模板的类型推导,可以自行百度,模板类型推导是编译期间的事情,根据传入类型和函数参数推导,我也是看的一知半解,不详细,比如有时&会无效,const会无效
4 模板的支持,这个是百度来的,C++支持两种编译模式,一个是通用的编译模式,一个是支持分开编译模式(据说有的编译期支持,但是不知道什么编译期支持),为了通用,我们只能选择写在同一个文件,因为我们一般.h,cpp分开写,所以一般通用做法是写 .h, 声明和实现可以分开写,但是一定要写在同一个文件,否则会发生连接错误,这个具体原因可以百度,首先记住这个规则就好
二 代码示例比较容易些,网上能找到一片
1 普通
如上,这里要说明的是,第二个特化模板不能单写的,必须先有普通模板,然后写上特化模板才行,只写特化模板会直接报错,第三个,实际是一个明确类型的普通模板,这个的一些规则我们上面讲过,常量,全局变量能让他推导出类型的参数,这个可以单独写出来,尽管,有时候你可以fun(a)不加<>也能匹配,但个人觉得这个并不好,C++的语法让人讨厌的一个地方,
其中第三个,C++11中分数就是这么搞得,当时看的我头晕,所以只能回头看模板怎么写
2 指针和引用
这个搞了很久,才明白是这么调用的,记得我们上面的规则,明确类型,只准使用int
3 同一个文件声明和实现可以分开写
注意实现,有的面试题会有这样的题目,声明之后的函数可以调用,具体还是要百度模板推导,暂时写这么多
一 重要的规则:这一点很多资料能说出一堆,说的很多很细致,我来说几个比较重要的,
1.模板类型,推荐用typename,虽然效果等同于class,但是有些场合必须使用typename ,当然这个尤其是使用类模板时你会用的到,应该是成员函数模板(类模板还没开始学习呢)
2.指定的非类类型(不是class,基本类型比如int,double),只能使用int类型,template,其他类型不允许,(char貌似也是可以,某种程度的int,可能是这个原因吧)
template<double> void f() { cout << "double" << endl; }
这段代码放到VS2003下编译没问题,但Ubuntu,gcc5.4有问题,我记得使用VS2017也是不行的,这很可能是C++11已经不支持这个了,在VS2003下甚至可以f<5.5>(),但是C++11不支持,指针和引用都是可以的,如double*,
3 具体化类型要使用全局变量或者常量,这个涉及到模板的类型推导,可以自行百度,模板类型推导是编译期间的事情,根据传入类型和函数参数推导,我也是看的一知半解,不详细,比如有时&会无效,const会无效
4 模板的支持,这个是百度来的,C++支持两种编译模式,一个是通用的编译模式,一个是支持分开编译模式(据说有的编译期支持,但是不知道什么编译期支持),为了通用,我们只能选择写在同一个文件,因为我们一般.h,cpp分开写,所以一般通用做法是写 .h, 声明和实现可以分开写,但是一定要写在同一个文件,否则会发生连接错误,这个具体原因可以百度,首先记住这个规则就好
二 代码示例比较容易些,网上能找到一片
1 普通
template<typename T>//1 普通模板 void fun(T a) { // a = 10; cout << a << endl; } template<> //2 特化模板 void fun<int>(int a) { a = 11; cout << a << endl; } template<int val> //3 实际是普通模板 void fun(int a) { a = val; cout << a << endl; cout << val << endl; } int main() { int a; fun<double>(a);//1 fun<int>(a);//2 fun<5.5>(a);//3 }
如上,这里要说明的是,第二个特化模板不能单写的,必须先有普通模板,然后写上特化模板才行,只写特化模板会直接报错,第三个,实际是一个明确类型的普通模板,这个的一些规则我们上面讲过,常量,全局变量能让他推导出类型的参数,这个可以单独写出来,尽管,有时候你可以fun(a)不加<>也能匹配,但个人觉得这个并不好,C++的语法让人讨厌的一个地方,
其中第三个,C++11中分数就是这么搞得,当时看的我头晕,所以只能回头看模板怎么写
2 指针和引用
template<double* val> void fun(double d) { cout << *val << endl; cout << d << endl; } double d = 10.0; int main() { fun<&d>(100.1); }
这个搞了很久,才明白是这么调用的,记得我们上面的规则,明确类型,只准使用int
3 同一个文件声明和实现可以分开写
template<char T> void foo(); int main() { foo<'c'>(); getchar(); return 0; } template<char T> void foo() { cout << "char" << endl; };
注意实现,有的面试题会有这样的题目,声明之后的函数可以调用,具体还是要百度模板推导,暂时写这么多
相关文章推荐
- 06 C++中类、函数、成员模板基本用法
- C++之函数模板详解(二)
- C/C++头文件、函数使用说明
- C++进阶之函数模板
- 32、不一样的C++系列--函数模板
- C++ 定义函数模板
- 利用C++模板,代替虚函数实现类的静态多态性及动态继承
- 小白教你学习C++(5)函数模板的使用
- 漫谈C++为什么不支持模板虚函数
- 【C++】:C++之函数模板
- C++ 函数模板
- WordPress常用模板、函数、及标签说明
- C++模板(一)-函数模板
- 【转】王老师 C++ 函数重载和模板
- 简化版 栈的C++实现及栈的函数模板
- 编译器对C++ 11变参模板(Variadic Template)的函数包扩展实现的差异
- C++中对sprintf()函数的说明(转)
- 利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)
- 【c++】泛型编程之函数模板
- C++ 函数模板