在C++中,我们通常将声明放在.h头文件中,将具体的实现代码放在.cpp文件中。但是函数模板通常不这么做,函数模板是将其声明和实现都放在.hpp文件中。hpp是Header Plus Plus的缩写,是专门存放模板文件的格式。可能有人会问,为什么要将函数模板的声明和实现放在一个头文件中?这是因为当编译器读到函数模板的实现时,因为没有具体的模板参数,所以还不能为它创建一个函数实例,只有当使用这个函数模板的时候,才会为它创建一个具体的函数实例;所以,对于编译器而言,函数模板的实现其实也是一种声明,是声明如何构建一个模板函数的方法。

在前面的几章中,我们都是将函数模板和主函数放到了一个cpp文件中,但是在实际的工作中,都是将函数模板和主函数相分离的。今天,我们就使用HPP文件来实现函数模板和主函数相分离的目标。

例1 使用HPP文件实现模块化编程

Add.hpp文件

#ifndef _ADD_HPP_
#define _ADD_HPP_
template<typename T>
T Add(T t1, T t2)
{
return t1 + t2;
}
#endif

主文件

#include<iostream>
#include "Add.hpp"
using namespace std;
void main()
{
int nRet = Add<int>(1,2);
cout << "和:" << nRet << endl;
}

运行效果如图1所示:

aaarticlea/png;base64,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" alt="" />

图1 使用HPP文件实现模块化编程

例1中,我们首先在Add.hpp文件中创建了一个函数模板Add.hpp,之后在主文件中使用include包含Add.hpp文件,这样就可以实现函数模板和主函数的分离效果了,也就是所谓的模块化编程思想。

今天我们主要讲述了函数模板的载体和在实际的工作中,如何将函数模板和主函数分离的方法,从而实现模块化编程的目标。大家可以回去实践一下,加深体会。

函数模板的载体-HPP的更多相关文章

  1. C++函数模板&类模板

    函数模板 模板概念及语法 主要目的,简化代码,减少重复代码.基本语法格式:  template<class T> 或者 template<typename T> //末尾不加分 ...

  2. C++函数模板详解(一):概念和特性

    函数模板是指这样的一类函数:可以用多种不同数据类型的参数进行调用,代表了一个函数家族.它的外表和普通的函数很相似,唯一的区别就是:函数中的有些元素是未确定的,这些元素将在使用的时候才被实例化.先来看一 ...

  3. C++ Templates (1.5 重载函数模板 Overloading Function Templates)

    返回完整目录 目录 1.5 重载函数模板 Overloading Function Templates 1.5 重载函数模板 Overloading Function Templates 和普通函数一 ...

  4. C++ Templates (1.1 初窥函数模板 A First Look at Function Templates)

    返回完整目录 目录 1.1 初窥函数模板 A First Look at Function Templates 1.1.1 定义模板 Defining the Template 1.1.2 使用模板 ...

  5. c++11-17 模板核心知识(一)—— 函数模板

    1.1 定义函数模板 1.2 使用函数模板 1.3 两阶段翻译 Two-Phase Translation 1.3.1 模板的编译和链接问题 1.4 多模板参数 1.4.1 引入额外模板参数作为返回值 ...

  6. C++进阶-1-模板基础(函数模板、类模板)

    C++进阶 模板 1.1 函数模板 1 #include<iostream> 2 using namespace std; 3 4 // 模板 5 6 // 模板的简单实例 7 // 要求 ...

  7. c++函数模板作为类的成员函数,编译报错LNK2019的解决方法

    为了使某个类的成员函数能对不同的参数进行相同的处理,需要用到函数模板,即template<typename T> void Function(). 编译时报错LNK2019 解决方法: 1 ...

  8. C++STL - 函数模板

    模板主要是为了泛型编程,做到与类型无关 模板有函数模板和类模板,本文主要整理的是函数模板 1.函数模板定义 template<typename 类型形参1,typename 类型形参2,...& ...

  9. 使用getopt_long来解析参数的小函数模板

    getopt_long原型 #define no_argument 0 #define required_argument 1 #define optional_argument 2 struct o ...

随机推荐

  1. 【关于微软的上一代模板引擎 T4引擎】

    导语:国内有名的动软代码生成器用的就是T4引擎......可以自己下载下来用用,批量生成固定模式的代码文件,十分有用........... 示例代码:示例代码__你必须懂的T4模板:浅入深出.rar ...

  2. JS 的Date对象

    原文 http://www.cnblogs.com/towerking/p/3220410.html 一.获取Date对象 在JS中我们可以通过下面一段代码获取本地时间 var currentDate ...

  3. 解决ssh无密码登录不成功的问题

    把ssh设置为无密码登录很简单,只需两步: 1.在本地创建公钥和私钥: ssh-keygen -t rsa 2.然后把公钥上传到远程机器上: ssh-copy-id -i ~/.ssh/id_rsa. ...

  4. UESTC_我要长高 CDOJ 594

    韩父有N个儿子,分别是韩一,韩二…韩N.由于韩家演技功底深厚,加上他们间的密切配合,演出获得了巨大成功,票房甚至高达2000万.舟子是名很有威望的公知,可是他表面上两袖清风实则内心阴暗,看到韩家红红火 ...

  5. 认识Junit

    JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个. JUnit有它自己的JUn ...

  6. Hyperion Essbase BusinessRule 函数学习--2

    @AVG Returns the average of all values in expList. [返回表达式列表的平均值] Syntax @AVG (SKIPNONE | SKIPMISSING ...

  7. 【计算几何初步:多边形中心】【HDU1115】Lifting the Stone

    一.质点系重心公式 x=(x1*m1+x2*m2+x3*m3.....xn*mn)/M  (M=m1+m2+m3+m4...+mn) 二.三角形重心 可直接求得,但在多边形剖分中 各三角形的质点的质量 ...

  8. js判断是否安装flash

    <script type="text/javascript"> (function () { var noFlash = "你的浏览器没有安装Flash,会影 ...

  9. 【转】SSIS 2012 – Package Configurations Menu Option Missing

    原文:http://dataqueen.unlimitedviz.com/2012/01/ssis-2012-package-configurations-menu-option-missing/ I ...

  10. C语言中命名空间的实现

    foobar.h // inclusion guard #ifndef FOOBAR_H_ #define FOOBAR_H_ //// long names //int foobar_some_fu ...