模板函数

1.函数可以和类一样定义为模板函数。

模板函数与模板类最大的不同是:模板函数可以通过函数的参数确定模板类型。

template<class T,int i> T&lookup(string<T> &s,const int n){......}

string<float> s;

int x=0;

lookup(s,x);//这里自动识别到T就是float

类模板不会对参数进行推断的原因是一个类可以提供多个构造函数,在某些时候对模板类的参数进行推断是无法完成的。

当模板函数无法通过参数推断它的类型时,需要程序员显示描述:

template<class T> T *function(){......}

void f()

{

  int*p=function<int>( ); //需要显示的描述出模板类型

}

显示描述最常见的情况就是为模板函数提供返回值的类型。

2.模板函数的重载

模板函数和普通的函数一样,可以声明多个具有同样名字的函数模板,甚至可以声明多个具有同一个名字的多个函数模板和常规函数的组合。

进行函数重载时,会按照重载解析去找出最佳匹配,找不到匹配或者出现两个以上的匹配就会报错。会优先选择常规函数。

template<class T> T sqrt(T);

templete<class T> complex<T> sqrt(complex<T>);

double sqrt(double);

void f (complex<double>z)

{

  sqrt(2);//sqrt<int>(int)

  sqrt(2.0);//sqrt(double);优选选择匹配的常规函数,常规函数是能够同时匹配的模板函数的子集。

  sqrt(z);//sqrt<double>(complex<double>);complex<T> sqrt(complex<T>)是T sqrt(T)的子集,子集意味着更针对,所以选择子集。

}

——————————————————————————————————————————————————————————

tmplate<class T> T max(T,T);

max(1, 2);//max<int>(int,int)

max(‘a‘, ‘b‘);//max<char>(char,char)

max(1.3, 1);//错误,直觉会选择提升int为浮点类型。但是这里在重载解析时已经发生了歧义。也不存在一种标准转换如子类指针值赋给基类指针。

max<double>(2.1, 5);//不存在重载解析的歧义,故和常规函数一样发生了隐式转换。

———————————————————————————————————————————————————————————

tmeplate<class T> T get(T&p,int n);//对p发生参数类型推断,不能进行隐式类型转换。对第二个参数n,所有可能的转换都需要考虑。

——————————————————————————————————————————————————————————

函数模板大可看作一种编译辅助完成重复性声明的技术,它能减少部分重复性的工作,提升效率,而且在代码可读性上有所提升。

模板函数,布布扣,bubuko.com

时间: 2024-08-24 17:01:52

模板函数的相关文章

C++ 模板函数与模板类

一.模板函数 函数模板提供了一类函数的抽象,即代表了一类函数.当函数模板被实例化后,它会生成具体的模板函数.例如下面便是一个函数模板: 当实际调用它时,就会生成具体的模板函数:    模板函数在调用过程中会进行数据类型的自动匹配(在不产生歧义的情况下),但如果需要指定类型的话,可以显示声明,如: 这样,函数模板中的T就会被double所代替. 自动匹配有以下的规则: 1) 函数实参是否满足模板的实参(此时的判断没有数据类型的转换): 2) 若不满足1), 函数实参进行数据转换在进行匹配: 3)

嵌入式之---常用模板函数(用法说明函数、参数解析函数)

主要内容:嵌入式常用模板函数(用法说明函数.参数解析函数) /*显示参数列表*/ void usage() {     printf("usage: server [-p:x] [-i:IP] [-o]\n\n");     printf("       -p:x      Port number to listen on\n");     printf("       -i:str    Interface to listen on\n");

忍不住吐槽类模板、模板类、函数模板、模板函数

最近在查资料,发现了一些blog上写"类模板.模板类.函数模板.模板函数的区别"之类的文章.一看之下,闭起眼睛想想,自己写了这么久C++,知道模板,知道函数,也知道类.如果单独问我,类模板或者模板类,我都认为是采用了模板的类.但不知道这"类模板.模板类.函数模板.模板函数"是什么东西. 仔细看了下文章,忍不住吐槽了.其实就是采用模板的类叫类模板,实例化后叫模板类.采用模板的函数叫函数模板,实例化后叫模板函数.好吧,你赢了.知道模板的都会知道,模板实例化后会由编译器生

C++学习之模板 ----函数模板、类模板

本博文主要讨论函数模板与类模板以及其简单应用. 1).作用:函数模板和类模板都可以看做是一种代码产生器,往里面放入具体的类型,得到具体化的函数或者class. 2).编译(分为两步): a):实例化之前,先检查模板本身语法是否正确: b):根据 函数调用或者类模板调用 ,先去实例化模板代码,产生具体的函数/类. 也就是说, 没有函数调用或者类类型对象声明,就不会实例化模板代码,在目标文件obj中找不到模板的痕迹. 3):优缺点 模板的缺点是代码膨胀,编译速度慢,而优点是运行速度快. 一.函数模板

模板类和模板函数的声明和定义分开文件写的方法

据说模板类和模板函数的声明和定义要写在同一个文件. 不然编译会出现"未定义的引用". 其实是有解决方法的. 模板类 template class CNNConvLayer<double>; 就是 template class className<typeName>; 模板函数 template void poolBackPropForKernal<double>(double*, double*, int, int, double*, double*

聊聊C++模板函数与非模板函数的重载

函数重载在C++中是一个很重要的特性.之所以有了它才有了操作符重载.iostream.函数子.函数适配器.智能指针等非常有用的东西. 平常在实际的应用中多半要么是模板函数与模板函数重载,或者是非模板函数与非模板重载.而让模板函数与非模板函数重载的情况却很少. 前几天在项目中偶然遇到了一个模板函数与非模板函数重载的诡异问题,大概相当于下面这种情况: 1 template <typename T> 2 int compare(const T& lhs, const T& rhs)

(转)c++模板函数声明定义分离编译错误详解

当我们声明和定义一个模板的时候,必须要让声明和定义放在一个文件里.否则编译器会报错. 这就是为什么boost的实现文件的后缀名是hpp了. 这其中的理由是什么呢?为什么会这样? 首先,一个编译单元(translation unit)是指一个.cpp文件以及它所#include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件(假定我们的平台是win32),后者拥有PE(Portable Executable,即windows可执行文

函数模板和模板函数

1.1函数模板的声明函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数.函数模板的声明形式为:template<typename 数据类型参数标识符><返回类型><函数名>(参数表){ 函数体}其中,template是定义模板函数的关键字:template后面的尖括号不能省略:typename(或class)是声明数据类型参数标识符的关键字,用以说明它后面的标识符是数据类型标识符.这样,在以

(转)WordPress常用模板函数 修改或自制WordPress主题必备

对于很多WordPress新手来说,不懂任何代码的情况下去瞎改WordPress主题,得出的效果往往会出现语法错误之类的东西或效果不尽人意.想要修改 WordPress主题模板文件最基本的当然要懂得HTML代码,熟悉DIV+CSS布局,PHP代码也得略懂一二. 不过一些比较简单易懂的代码和函数,学习起来并不难,用多改多了你就会记得它,同时这些基本的代码和函数对于一个WordPress 修改主题新手来说尤其重要,当然,我这里说所的是相对有兴趣修改WordPress主题模板的新手,注重网站内容的新手