在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. 关于VMWARE虚拟机安装GHOST版XP后不能硬盘启动问题

    工具: VMware Workstation 9.0 Ghost xp sp3 中英 双语版 现象:建立硬盘分区,设置活动分区...ghost安装顺利,安装完成后不能硬盘启动,如果从硬盘启动则黑屏,出 ...

  2. RBF径向基神经网络——乳腺癌医学诊断建模

    案例描述 近年来疾病早期诊断越来越受到医学专家的重视,从而产生了各种疾病诊断的新方法.乳癌最早的表现是患乳出现单发的.无痛性并呈进行性生长的小肿块.肿块位于外上象限最多见,其次是乳头.乳晕区和内上象限 ...

  3. VBA:Google翻译(含tk算法)

    完整的tk算法: //源自http://translate.google.cn/ TKK=eval('((function(){var a\x3d618632403;var b\x3d14854840 ...

  4. Co-prime Array&&Seating On Bus(两道水题)

     Co-prime Array Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Su ...

  5. Android应用程序组件Content Provider应用实例

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6950440 文简要介绍了Android应用程序 ...

  6. 9.5 在 C# 中使用 F# 库

    9.5 在 C# 中使用 F# 库 像 C# 一样,F# 也是一种静态类型的语言,就是说,编译器知道每一个值的类型,以及类方法和属性的签名.对于与 C# 的互操作性来说.这是很重要的,由于,编译器能够 ...

  7. linux中curl命令

    linux curl是一个利用URL规则在命令行下工作的文件传输工具.它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称url为下载工具. 一,curl命令参数,有好多我没有用过,也不知道翻 ...

  8. @@IDENTITY在加触发器时返回错误的ID值

    表ID是自增的,所以在添加时要查一下,之前是用@@IDENTITY来查,最近在加触发器时发现返回的会是在触发器中插入语句的数据ID值,上网找了下资料,发现是因为@@IDENTITY 将返回在当前会话中 ...

  9. 在linq查询环境下通过sql语句来访问数据库

    接上一篇随笔 这里主要介绍在linq环境下,如果实现用sql来访问数据库,同时也介绍在EF框架中如何添加新的方法来访问数据库. 1.首先,在数据访问层(EF.DAO,EF.IDAO)中添加具体的函数来 ...

  10. 利用cookie改变背景色

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...