zoukankan      html  css  js  c++  java
  • C++使用函数模板

    函数模板:

    函数模板是蓝图或处方功能,编译器使用其发电功能系列中的新成员。

    第一次使用时,新的功能是创建。从功能模板生成的函数的实例称为模板或模板的实例。函数模板的开始是keywordtemplate,表示这是一个模板。

    其后是一对尖括号,它包括了參数列表。

    在使用从模板中生成的函数之前,必须确保把声明(即原型)或模板的定义放在源文件里。模板的实例化仅仅生成一次。

    假设兴许的函数调用须要同一个实例,就会调用已经创建好的实例,即使同一个实例在不同的源文件里生成,程序也仅会包括该实例定义的一个副本。

    使用时须要注意两个问题:
    第一,函数模板本身不做不论什么工作,它是编译器用于从函数调用中创建函数定义的处方或蓝图。

    第二。全部工作都在编译和链接过程中完毕。

    编译器使用模板生成函数定义的源码。再编译这些代码。链接程序的作用是仅把函数的一个实例链接到可运行模块上,即使几个不同的源文件调用同一个实例。也仅仅链接一个实例。在运行程序时,源码中是否存在模板根本不重要。

     

    显示指定模板參数:

    在调用函数时,能够显示指定模板的參数,以控制使用哪个版本号的函数。编译器不再判断用于替换T的类型,仅仅是接受指定的版本号。

    在下列情形下,比較实用:

    1、函数调用不是非常确切,编译失败。

    此时能够使用该技巧帮助编译器去除不确定性。

    2、在一些情况下,编译器不能判断出模板參数,因此无法选择要使用哪个版本号的函数。

    3、为了避免有太多的函数版本号(从而避免过多占用内存)。能够强迫函数调用使用某个版本号的函数。

     

    模板的说明:

    对于某个參数值(在有多个參数的模板中,就是一组參数值)。模板的说明定义了它不同于标准模板的动作。模板说明的定义必须放在原语句的声明或定义之后。

    假设把说明放在前面,程序就不会编译。

    说明的定义以keywordtemplate开头,但要省略參数。所以原声明中模板參数外部的尖括号就是空的。必须定义说明的參数值。并且必须放在模板函数后面的尖括号里。以下看演示样例:


    演示样例:

    #include <iostream>
    using std::cout;
    using std::endl;
    //模板声明
    template<class T> T larger(T a,T b);
    //模板说明声明
    template<> long* larger<long*>(long* a,long* b);
    int main(int argc,char* argv[]){
    
    	cout<<"Larger of 1.5 and 2.5 is "<<larger(1.5,2.5)<<endl;
    	
    	int a_int=35;
    	int b_int=45;
    	cout<<"Larger of "<<a_int<<" and "<<b_int<<" is "
    		<<larger(a_int,b_int)<<endl;
    	
    	long a_long=9;
    	long b_long=8;
    	cout<<"Larger of "<<a_long<<" and "<<b_long<<" is "
    		<<larger(a_long,b_long)<<endl;
    	
    	//显示指定模板參数
    	cout<<"Larger of "<<a_int<<" and "<<b_int<<" is "
    		<<larger<long>(a_int,b_int)<<endl;
    	
    	//调用模板说明
    	cout<<"Larger of "<<a_long<<" and "<<b_long<<" is "
    		<<*larger(&a_long,&b_long)<<endl;
    	return 0;	
    } 
    //模板定义
    template <class T> T larger(T a,T b){
    	cout <<"standard version"<<endl;
    	return a>b?

    a:b; } //模板描述定义 template <> long* larger<long*>(long* a,long* b){ cout <<"specialized version"<<endl; return *a>*b?a:b; }


  • 相关阅读:
    static-keys.txt 翻译
    sqlserver sp_executesql 返回值
    socket上传文件
    threadingSocket 服务器端可以同时接受多个客户端的访问
    python ftp上传
    Python sys模块
    linux系统相关
    下载论文,电子书籍(中英文),专利,数据库和课件
    如何设计一个合理、灵活的深度学习训练框架
    使用小米电视的第一天
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5035453.html
Copyright © 2011-2022 走看看