今天重新温习C++ Template,觉得程序这东西还是要经常的写才好,才能深入理解,才不容易忘记。
Ok,闲话少说,进正题。。。
觉得学习东西有一个很好的步骤,就是先提问:
1.What is The Template?
2.Why Template?
3.How Template?
函数模板
What's the Template?
1.函数模板:函数模板提供了一种函数行为,该函数支持多种不同参数类型的调用。
- //basics/max.hpp
- template <typename T>
- inline T const& max(T const& a,T const& b)
- {
- return a<b?b:a;
- }
注:关键字typename 可以用class关键字替代。
模板的编译
如果试图基于一个不支持模板内部所使用操作的类型实例化一个模板,那么将会导致一个编译期错误。
- std::complex<float> c1, c2; // doesn't provide operator <
- …
- max(c1,c2); // ERROR at compile time
于是我们得出结论:模板被编译两次
1.实例化之前,先检查模板代码本身,查看语法是否正确。(如,遗漏分号等)
2.在实例化期间,检查模板代码,查看是否所有调用都有效。(如,实例化类型不支持某些函数的调用等)
注:与普通函数编译链接有区别,普通函数编译时,只要引用的头文件中有函数的声明,编译就能通过。
模板调用
1.对实参进行强制类型转换,使它们可以相互匹配
max(static_cast(4),4,2);
2.显示指定T的类型
max(4,4.2)
3.指定两个参数可以具有不同的数据类型
template >
模板重载
- // basics/max2.cpp
- // maximum of two int values
- inline int const& max (int const& a, int const& b)
- {
- return a<b?b:a;
- }
- // maximum of two values of any type
- template <typename T>
- inline T const& max (T const& a, T const& b)
- {
- return a<b?b:a;
- }
- // maximum of three values of any type
- template <typename T>
- inline T const& max (T const& a, T const& b, T const& c)
- {
- return max (max(a,b), c);
- }
- int main()
- {
- ::max(7, 42, 68); // calls the template for three arguments
- ::max(7.0, 42.0); // calls max<double> (by argument deduction)
- ::max('a', 'b'); // calls max<char> (by argument deduction)
- ::max(7, 42); // calls the nontemplate for two ints
- ::max<>(7, 42); // calls max<int> (by argument deduction)
- ::max<double>(7, 42); // calls max<double> (no argument deduction)
- ::max('a', 42.7); // calls the nontemplate for two ints
- }
普通函数可以与包含它实例化形式的模板函数共同存在,可以被不同形式的语句调用,上面main中第三句调用的就是普通函数,而第五句就是调用的模板函数。
模板函数的嵌套调用
- // basics/max3a.cpp
- #include <iostream>
- #include <cstring>
- #include <string>
- // maximum of two values of any type (call-by-reference)
- template <typename T>
- inline T const& max (T const& a, T const& b)
- {
- return a < b ? b : a;
- }
- // maximum of two C-strings (call-by-value)
- inline char const* max (char const* a, char const* b)
- {
- return std::strcmp(a,b) < 0 ? b : a;
- }
- // maximum of three values of any type (call-by-reference)
- template <typename T>
- inline T const& max (T const& a, T const& b, T const& c)
- {
- return max (max(a,b), c); // error, if max(a,b) uses call-by-value
- }
- int main ()
- {
- ::max(7, 42, 68); // OK
- const char* s1 = "frederic";
- const char* s2 = "anica";
- const char* s3 = "lucas";
- ::max(s1, s2, s3); // ERROR 错误产生
- }
发生错误:
对于3个C-String 调用max(),那么语句产生
return max(max(a,b),c)
这里max(a,b) 讲产生一个c的新的临时的局部值,返回则返回该临时值得引用,无效的引用。
- // basics/max4.cpp
- // maximum of two values of any type
- template <typename T>
- inline T const& max (T const& a, T const& b)
- {
- return a<b?b:a;
- }
- // maximum of three values of any type
- template <typename T>
- inline T const& max (T const& a, T const& b, T const& c)
- {
- return max (max(a,b), c); // uses the template version even for ints
- } // because the following declaration comes
- // too late:
- // maximum of two int values
- inline int const& max (int const& a, int const& b)
- {
- return a<b?b:a;
- }
在这段语句中,三个参数模板调用的也是模板函数。
阅读(426) | 评论(0) | 转发(0) |