成都网站建设设计

将想法与焦点和您一起共享

C++标准模板库(STL)前置知识——day1(函数模板)-创新互联

一、概述

  在C++中,模板的意义就是将类型参数化,函数模板负责抽象出某一种操作,而操作的数据类型以及返回值的类型由程序员调用的时候决定。

公司专注于为企业提供网站制作、网站设计、微信公众号开发、电子商务商城网站建设,成都小程序开发,软件按需求定制开发等一站式互联网企业服务。凭借多年丰富的经验,我们会仔细了解各客户的需求而做出多方面的分析、设计、整合,为客户设计出具风格及创意性的商业解决方案,成都创新互联更提供一系列网站制作和网站推广的服务。二、函数模板与模板函数

  初学的时候容易把这两者弄混,其实这两者是不一样的。函数模板是模板,由于类型还不确定,编译器不会去编译模板,而模板函数是函数模板实例化出来的一个函数,此时类型已经确定,编译器会编译模板函数。
  比如说下面是一个函数模板,compare是模板名,编译器不会编译这一段代码。

templatebool compare(T a, T b){return a>b;
}

  但当用户调用模板代码的时候,比如

compare(3,4);

  将会实例化出一个模板函数,如下,其中函数名字为compare,这段代码才是被编译器编译的函数定义。

bool compare(int a,int b){return a>b;
}
三、实参推演

  假如我们定义了一个函数模板,如下

templatebool compare(T a, T b){return a>b;
}

  一般的使用方式是指定类型去使用,比如

compare(3,4);
compare(1.2,2.2);

  但如果我们不指定类型的话,比如

compare(3,4);
compare(1.2,2.2);

  这样也是可以的,而且结果也是我们想要的,因为此时编译器会进行实参推演,根据传入参数的类型自动实例化出合适的模板函数。

compare(3,4); //compare(3,4);
compare(1.2,2.2);//compare(1.2,2,2);

  注意,如果没法配匹到合适的模板函数,编译器依然会报错。比如像如下调用时,没法匹配到两个参数为不同类型(int,double)的模板函数,所有会报错。

compare(3,2.2);
四、模板的特例化

  还是使用上面的compare函数模板,当我们调用如下代码时

compare("123","456");

  编译器虽然不会报错,但得到的结果是比较两个字符串的地址的大小,于我们而言没有什么意义,我们想得到的是字符串内容的大小关系,此时就需要使用特例化,重写当类型为const char * 时的比较逻辑,示例如下:

template<>bool compare(const char* a,const char* b){return strcmp(a,b)>0;
}
五、注意事项

  模板代码一般放在头文件中定义好,然后在源文件中#include包含,如果头文件中只有声明,没有定义,编译的时候会出现链接错误,因为没办法实例化该模板函数。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网页标题:C++标准模板库(STL)前置知识——day1(函数模板)-创新互联
文章链接:http://chengdu.cdxwcx.cn/article/ijhpj.html