在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,iVBORw0KGgoAAAANSUhEUgAAAqUAAABbCAIAAADFvWslAAAL1klEQVR4nO2d7W8cRwGH/efcH+Dv/mhhBBxKDUSosuFUqUEICVlUAoEsQKhpQ1rauuIcSENSmkYmJJyvUZymcc6uoKZJpdrUJcECekVqq8bvDrVNP5gP57ubt52dvdu9uRs/jx5V9t3uzsu685vZ3bv0zUzmERERMWz7ZibzmwsnEBERsWXfyue7wajqkfeIiIgp6D3pyXtERMTM9Z705D0iImLmek968h4RETFzvSc9eY+IiJi53pOevEdERExgzkrUXt6TnrxHRERMYIfz/uDg4ODgwP5K5/J+4U9P3Lj4QxffuvqD9b887v1sISIitqYl1DNa34sB307Yp5D3l69O3313+e6772kuv7O4/M7i8vSN+emZuemZuYtTV/5941vezxaGbbmQyxWGvVcjY0cmBnO5waEl/zVJbLnQczXv4d7G1O183jdivs2wTyHvZytze/v7u3sx7u3v35ydu/faiPezhSm6NN4vX83qnygZtxwey+XGip2okinv7aUPjwkNSKmS5hLV7mo9QjJMoKXxfqED3RoSed4jTlDKNQ+mt7EH9JL37a/s08n7ufn5e//4z8mzs0+du/X0+TdO/f7m6Vdff//9f62vrX5YrX5Yra6trZ4p3TlTukPeh+fSeL80DpaG8jnz8rpjqzrj+j6q9FokiFFRLiSIrphqaCXK3eV31ahn5MjEYD0ahQ50aIjtvDv2DL2NveKRXt9X5ubvr3z0+DPTJ54vfbd45XtnL3//wtTi4sr66qdi3p+9/lfyPjzVcX/hRG1oy49rJ7o0lE+yCmxZ8/V8Y+nFgUQL02SaSjTGZGcue2hqCVQcqNVN7UCXhtQPaDjvxhOUeu4G09uYgUmfrYs9WgtvpbWy93z//vU3bt9f+egnF258p3j50Rd+d/zFyeOTE4uLK+urD6rVarX6wdra6oX5N1+9M0veh6dp3K8tmgfKCyfkRdXIxKCUB8q4b/i1MQ7Wlo+mS+61vcq1K7faAFou5HKHIaSWbnolyuGxw+Yk2sBwfK27mjGgN8Sl4eoK23zhWrhhMTi0pF3oViqpJZBLQ5TzbqvSYc3Fd+XbB5Y/ks3igFDt4YnBxr7B9LamqSztutTwWC7i/xceO8gg7y1E7ZXiZXyfz+fX8v7YqbNfOPnCl579Vf7FXx47c7K2vq9WP6it7//4t+ulv0+T9+FpHPeFxZZ8EbU4IOWBtLyujZKNX0cmBuvDWXFAGtpKQ3lh0Kwlunr9uTC8qY+JSukJVnut5b1WonnFedhkvSHxDZc6Vuo6+S0hY0pDE8Vmhxubb0ig2IZozbFU6bClcsrWa2jLe+WEqj0WTG+rPR/djcJMWu6HiOqhP9u8np+WUdVLlvdfPPX8l5975qu/PvXIb5/8xoWf1db3jev5yx8vL3+8TN6HZ/S4bxzdlFFP+LU4kMv15xtLtObQbLhKLK4jy4WcMsofDqDKyKuXnuD+Qqt5r43ycndJazKtIQ4NF4Z7qbeV+ZY5ThIlkL0h+nm3VMlwyoR2WfJe7xCldcH0ttTAqG5s1Fm+rGLfBb3pPenTzPuvTJw+NvnU1176xfGXf/ropR8vLq6sCffv9/d29/d2yfvwjF/nySqjm7QWLww3jtY8rHHqIKxg9JvB5UIuN9ifN91L1u4RWMdB+epuA2UJaNtAa6/l0q7xirFTwy3VsF3DSJZAhoZYzru1Zwz375vtis57Q1vUfA2mtxP+BQp/xg5/k+hF70mfZt4/8psnv37+5998ZXxk6kffvvLE4uLK6oN63q+uPny4s7mxQd6Hp9N9XFE5Zeu71xclpaF8bqC8cKJcEBf6LeZ93ETE9fmyNtb3Ue01bNlmApkH9BQTyKEhzfNuvVeSXd6H09vxB2xuoOc96d6Fek/6lPL+VmXpvX8+fXXqVOnS6fIrz157+bnr599+e6mR96sPHmxvba6trZH34Zn8OW35uaraAF08jPn61cjhMWsqR1xoPfRwADV/QkwqXb+wHGEbeS+XmCCBEjTc0uExbyVJoNiGiGXZ/gbMt2CMt6Jjmik/pBZUb8cesNlY/baF2ywWO6r3pE8n72du3v788/9tb61vb65vb67vbG/vbG/ubG3sfvbfvd3PHj7c2dra2thY39hYJ+/DUx1Sa49PN8cvw+NC+qeixwoDjV2Wxvtzg/15YRfTY3fyQ1vGvF8wfyjc8Jls6ar+yMSgfpG/nbyXSkySQAkarm5ZGsqL/SkfpP5zZDBEJZCtIep5t1XJ9Jyd8hRevTNrh5Ue9GueHcMzdyH0tjSJielG0yTJsgt61HvSp5P3f7h07ubsnO6typu35/986/Z845VLF8/dv0beB6X2PWtK7BkfD5bWOobhSR8ZhU9hKZ+Yt+X9ghoYeulaE7J4sqlZYqIEStRwqRWGq+V1tCfScwk+ISY3xHbebVWSPgtnuLssfRGN4VOazb2Mz8f1em+rjTKWpUx9lKmtrXqIJl3z/pO5x+5fG7n3Wrz3r418MveY94ahd/1+x0jnS8+iRC992GVfDmN+Hj6Y3kbsmPx7uJiZfj8j1PnS0y/R/cuCurwhbVbGdFM8mN5G7JTkPWK3muk3AXerS+P9QugOj3XsYvWR7G08UpL3iF1n49bs0fzMlXj/vgMX2I94b+PRkbxHREQMX/IeERExfMl7RETE8CXvERERw5e8R0REDF/yHhERMXxj8v7u1HFERETsFVvP+z6ZSqXSBwAAABlzcHCwmZDU8r5Sx1PbAQAAjgoe8r4i4Lv5AAAARwLP63vlV6YCAAAAWdBdeR/1ViKYNAAAACh0Ou8rEfSllPdizBP5AAAANQJc34sHIe8BAAD6ovN+dHQ027zXw5i8BwAAyAhj3o/WyTzvozK+zZzm/j0AAICInvejMpnkvXjDXrzd3qiW8dH9pG0j8gEAAGooeS/GfFTkk/cAAAA9hjHvo35NJ++NAd/H8/kAAACZoee9fnk/zbyPXcQbb70nSu6ogwAAABxZeuPzeIQ3AABAO3RR3gMAAEBGkPcAAADh4zPvFezxr78bO10wbuAyyWjtyPa3klam5coDAADo+Pn3cI1VSZr3SXexPMdXicO93NjWWR5TiD0OeQ8AAK3hZ30vhl87EeuS95Zjxh7NEt6NAyo/GMuKyvjYyYFSnHtbAAAARDznvYhLePc5TxHcwztqG8v2sXFu30Bsi/2AsY0CAABwwf/9e3ty66+7r4ntG1hKt88njEd22V6sv/5fYz1jGwUAAOCC/7xvYA8zPRrtueiY9y1gn38oL9qnC7FTB/0V/YAAAACxdDrv9fBzzLNE+d1C3ieqhjGz7WEc2+REtXXZAAAAoEEX3b+30wjF2GCO3cwS5MZyLS/qh7Jvb/nZXqjeOuOOAAAARvznveNi1xLPxp8tkWnEfVqgv1UxzTCiyrXMFez1JOkBAKBluiLvlTrpswF9M/sRYg/rsr3LwfW6xc4Pov5r3D72+AAAAC50Rd4bQ07BZcVsfzE276OwHLyRx5Yd9drqb8UmetTRAAAAXOiKvFfq5JLfxrWv/SCOSemyWdLJh+O+UdvHTkQsUxP7MTPaHgAAug2feW9ZHOsVdX8x6i37zCDRFESpv2MpLgUp21vKjd3YAnkPAHDU8Jb3jfBwDOaozewpHntY43GMPysvWiJfObiSlLETC5cZD9ELAACJ6K7r+ZYVs2UZbUnHSjTKvrHzBns9XYqwbGnZPupFIh8AANzx//16liA3vmhc/qYSh/YY9kVUHbxXDAAAegj/eQ8AAABZQ94DAACED3kPAAAQPuQ9AABA+JD3AAAA4UPeAwAAhI+S96Ojo0q666+Q9wAAAD2GnvdiwCu/kvcAAAA9iTHvaxkv/kzeAwAA9DD6/ftRGe7fAwAA9DzG5/UsYU/eAwAA9B5Rz+dHhT15DwAA0HvweTwAAIDwIe8BAADCh7wHAAAIH/IeAAAgfDqd94iIiNgrtpj3iIiIGIDkPSIiYviS94iIiOFL3iMiIoYveY+IiBi+5D0iImL4kveIiIjhS94jIiKG72HeIyIiYtj+H1fZgNDu3wN7AAAAAElFTkSuQmCC" 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. cxf2.7.10与Spring3.0.5集成时报错如下

    严重: Error listenerStart 2014-3-29 22:25:20 org.apache.catalina.core.StandardContext start 严重: Contex ...

  2. 锁机制与原子操作 <第四篇>

    一.线程同步中的一些概念 1.1临界区(共享区)的概念 在多线程的环境中,可能需要共同使用一些公共资源,这些资源可能是变量,方法逻辑段等等,这些被多个线程共用的区域统称为临界区(共享区),临界区的资源 ...

  3. jQuery_基础

    一.jQuery与DOM对象的转换. 1.jQuery对象转换为DOM对象:$cr[0] 或 $cr.get(0) $cr为jQuery对象 2.DOM对象转换为jQuery对象:$(cr) cr为D ...

  4. 超大批量删除redis中无用key+配置

    目前线上一个单实例redis中无用的key太多,决定删除一部分. 1.删除指定用户的key,使用redis的pipeline 根据一定条件把需要删除的用户统计出来,放到一个表里面,表为 del_use ...

  5. 大数据时代的数据存储,非关系型数据库MongoDB(一)

    原文地址:http://www.cnblogs.com/mokafamily/p/4076954.html 爆炸式发展的NoSQL技术 在过去的很长一段时间中,关系型数据库(Relational Da ...

  6. 微软雅黑 firefox Css 设置 font-family: "microsoft yahei","\5FAE\8F6F\96C5\9ED1","宋体";

    font-family: "microsoft yahei","\5FAE\8F6F\96C5\9ED1","宋体";    // 这里用引 ...

  7. Android framework浅析[转]

    Android系统从底向上一共分了4层,每一层都把底层实现封装,并暴露调用接口给上一层. 1. Linux内核(Linux Kernel) 1)Android运行在linux kernel 2.6之上 ...

  8. 2.9 Model Selection and the Bias–Variance Tradeoff

    结论 模型复杂度↑Bias↓Variance↓ 例子 $y_i=f(x_i)+\epsilon_i,E(\epsilon_i)=0,Var(\epsilon_i)=\sigma^2$ 使用knn做预测 ...

  9. Pros and Cons of T4 in Visual Studio 2008

    Oleg Sych - » Pros and Cons of T4 in Visual Studio 2008 Pros and Cons of T4 in Visual Studio 2008 Po ...

  10. Python 自动化脚本学习(三)

    函数 例子 def hello(): print("hello" + "world"); 有参数的函数 def hello(name): print(" ...