C++模板编程 - 第二章 - 函数模板

模板被编译两次

书上说模板被编译两次:一次是实例化之前,检查模板代码本身,这个好理解,就是检查和模板没有关系的代码;第二次编译是在实例化的时候,看看把类型带入进去有没有问题,比如说字符串没有除法。

还有一个需要注意的问题:模板在进行实例化的时候,编译器要能够看到模板的定义。下面的代码会挂掉,因为main.cpp把max.h包含进来,但是其中没有max的实现

 1 // max.h
 2 template<typename T>
 3 max.....
 4
 5 // max.cpp
 6 #include "max.h"
 7 .....
 8
 9 //main.cpp
10 #include "max.h"
11
12 int main()
13 {
14     max(1,2);
15     ...
16 }

返回类型作为一个参数

编译器在进行模板实例化的时候是不能根据返回值的类型推断用怎么实例化的。

1 template<typename T1, typename T2>
2 T1 convert(const T2 & in) { return static_cast<T1>(in); }
3
4 convert<double, int>(123.lf); // good
5 convert(123); // Noooooo!

非模板函数优先

手工制造的(非模板函数)和模子刻出来的(模板函数)比,手工制造的优先。

 1 #include<iostream>
 2
 3 using std::cout;
 4 using std::endl;
 5
 6 int max(int a, int b)
 7 {
 8     cout << "int max(int, int) is called." << endl;
 9     return a > b ? a : b;
10 }
11
12 template<typename T>
13 T max(const T & a, const T & b)
14 {
15     cout << "template<typename T> T max(const T &, const T &) is called." << endl;
16     return a > b ? a : b;
17 }
18
19 int main()
20 {
21     cout << max(1, 2) << endl;        // non-parametric max
22     cout << max<>(1, 2) << endl;    // parametric max
23
24     return 0;
25 }

今天先这个样子,滚去看数理方程了。

@2015/6/15

时间: 2024-11-11 07:12:39

C++模板编程 - 第二章 - 函数模板的相关文章

tornado的学习——第二章(模板与表单)

链接:http://demo.pythoner.com/itt2zh/ch2.html 来到了第二章:模板与表单 1 # -*- coding:utf-8 -*- 2 3 __author__ = 'roy' 4 5 import os.path 6 7 import tornado.httpserver 8 import tornado.ioloop 9 import tornado.options 10 import tornado.web 11 12 from tornado.option

模板(1)函数模板

1.引入 如何编写一个通用加法函数?第一个方法是使用函数重载, 针对每个所需相同行为的不同类型重新实现这个函数.C++的这种编程机制给编程者极大的方便,不需要为功能相似.参数不同的函数选用不同的函数名,也增强了程序的可读性.简单示例: 1 int Add(const int &_iLeft, const int &_iRight) 2 { 3 return (_iLeft + _iRight) ; 4 }f 5 loat Add(const float &_fLeft, const

C++ 编程第二章小结

switch()用法的注意事项 1:switch语句中的表达式只能是整形数据,字符型数据和枚举型数据,case后面的产量表达式的类型必须与switch括号后面的类型相匹配 2:各个case(包括default)的出现次序可以任意,每个case在带有break的前提下,case的次序不影响执行结果 循环设计 循环设计的几种分类方法这里介绍几种 1:字符图形类 2:素数判断类 3:逻辑判断类 4:级数逼近类 a:对于图形类的基本循环格式一般是 for(int i = 1; i < 10 ;i ++)

求变量的数据类型,typeid,bool,C和C++的不同,new和delete,C++中的枚举,inline和可变参数模板,auto和函数模板,宽字符

求变量的数据类型,通过函数typeid(变量名).name();获得变量的数据类型. 案例如下: #include <iostream> #include <stdlib.h> void main() { double db = 10.9; double *pdb = &db; auto num = pdb; //通过typeid的方式获得数据类型 std::cout << typeid(db).name() << std::endl; std::c

C++模板编程中只特化模板类的一个成员函数

模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数.类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现1.2个成员函数即可.在这种情况下,如果全部重写该模板类的所有成员函数,不但会增加工作量,也不利于代码的维护. 例如下面的类模板A,只有在模板参数是char*时才需要特化成员函数func(),但其他的成员函数都不需要特化: 1 template <typename _Ty> 2 struct A 3 { 4 // 其他成员函数a 5 //

C++模板编程中只特化模板类的一个成员函数(花样特化一个成员函数)

转自:https://www.cnblogs.com/zhoug2020/p/6581477.html 模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数.类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现1.2个成员函数即可.在这种情况下,如果全部重写该模板类的所有成员函数,不但会增加工作量,也不利于代码的维护. 例如下面的类模板A,只有在模板参数是char*时才需要特化成员函数func(),但其他的成员函数都不需要特化: 1 templ

[原创译书] JS函数式编程 第二章总结

?? Functional Programming in Javascript 主目录第二章 函数式编程基础上一节 函数式程序员的工具集 第二章总结 为了理解函数式编程,这章覆盖了很大范围的主题.首先我们分析了一个编程语言的函数式是什么意思, 并且评估了Javascript函数式编程能力.接下来,我们用Javascript实现了一些函数式编程的核心概念, 并展示了一些Javascript内建的函数式编程函数. 尽管Javascript有一些函数式编程的工具,它函数式编程核心的大部分仍被隐藏着,并

第二章-函数

1 函数的定义和调用 基本格式 function 函数名(参数列表){ 函数体 } 函数体中的return一旦执行, 函数就不在执行而是返回了 如果没有return, 则函数执行完毕就结束, 返回的值是undefined 第二种函数定义 var 函数名 = function (参数列表){ 函数体 }; 注意最后严谨一点加上分号表示赋值语句结束, 整个句子表示将函数赋值给一个变量, 该变量(参数列表) 就可以执行函数了 调用函数 函数名(参数列表); 函数赋值的变量(参数列表); JavaScr

C++模板编程 - 第九章 模板中的名称

名称的分类 1. 受限名称:前面有::运算符成员访问运算符.比如 this->var 2. 依赖型名称:以某种方式依赖于模板参数.比如 std::vector<T>::iterator 更详细的分类见P116. 名称查找 1 int x; 2 3 class B 4 { 5 public: 6 int i; 7 }; 8 9 class D: public B 10 { 11 }; 12 13 void f(D* pd) 14 { 15 pd->i=3; //ok 16 D::x=