C++提供了函数模板(function template)。
所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板
。
凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。
下面通过一个返回最大值的函数来举例。
定义函数模板的一般形式为:
template < typename T>
返回值类型 函数名 (参数表) {
template < class T>
返回值类型 函数名 (参数表) {
其中返回值类型和参数类型可以用T来指代
// main.cpp
// TestTemplateFunc
// Created by cc on 14-3-30.
#include <iostream>
using namespace std;
//声明模板函数
template <class T>
T calcMaxValue(T x, T y);
int main(int argc, const char * argv[]) {
//调用函数时,如果想让T指代int类型,则传入int实参,返回int类型
int maxVal = calcMaxValue(15, 5);
//如果想让T指代float类型,则传入的参数就是float类型,返回的类型也是float类型
//其他类型同理,使用函数模板可以减少函数重载的使用,优化代码量
float maxVal2 = calcMaxValue(231.12f, 555.231f);
cout << "较大值:" << maxVal << endl;
cout << "较大值:" << maxVal2 << endl;
return 0;
//定义模板函数,返回值类型和形式参数都用T来表示
template <class T>
T calcMaxValue(T x, T y) {
return (x > y) ? x : y;
输出结果:
本文由CC原创总结,如需转载请注明出处:
http://blog.csdn.net/oktears/article/details/22583207
C++提供了函数模板(function template)。所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。下面通过一个返回最大值的函数来举例。
我们知道在C++
模板
编程中如果我们特化或是偏特化某个
模板
类, 我们需要重写整个
模板
类中的所有
函数
, 但是这些代码通常是非常相似的, 甚至在某些情况下可能只有一两个
函数
会不一样,其他
函数
都是一样的。在这种情况下,同时存在多份相同的代码,对我们维护这些代码是非常不利的, 我们好只需要特化其中不一样的那个
函数
。
比如下面这个
模板
类:
template
struct Base
//other
function
void Func(){ cout << "primary
function
" <<
函数
模板
:
1.建立通用的
函数
,
函数
的类型和形参的类型不用指定,而用一个虚拟的类型来代表。将数据类型参数化。
2.凡是
函数
体相同的多个
函数
都可以使用
函数
模板
。
有以下重载
函数
:
int Max(int, int, int);
float Max(float, float, float);
double Max(double, double, double);
建立一种
模板
:
函数
模板
的声明:
template
<typename _Ty1&
模板
(
Template
)指C++程序设计语言中采用类型作为参数的程序设计,支持通用程序设计。
下面以不使用
函数
模板
,和使用
函数
模板
来实现同一功能的示例:
例子:实现计算一个数的幂次方的
函数
power,接受正幂次方数,如果是负幂次方数,就让结果等于0.
1.不使用
模板
如果不使用
函数
模板
,对于需要实现的功能相同,但参数的数据类型却不同的情况,则需要定义多个不同数据类型的
函数
:
//对于实现 整数类型 的幂次方
函数
int power(int base,int exponent)
int result =
函数
模板
介绍
函数
模板
案例普通
函数
与
函数
模板
的区别普通
函数
与
函数
模板
的调用规则三级标题四级标题五级标题六级标题
1.
函数
模板
,实际上是建立一个通用
函数
,它所用到的数据的类型(包括返回值类型、形参类型、局部变量类型)可不具体指定,而是用一个虚拟的类型来代替(实际上是用一个标识符来占位),等发生
函数
调用时再根据传入的实参来逆推出真正的类型。这个通用
函数
就称为
函数
模板
。
template
<typename T>
函数
声明或定义
注:
template
:声明创建
模板
;typename:表明其
1
模板
机制剖析
1.1 编译过程
hello.cpp程序是高级c语言程序,这种程序易于被人读懂。为了在系统上运行hello.c程序,每一条c语句都必须转化为低级的机器指令。然后将这些机器指令打包成可执行目标文件格式,并以二进制形式存储于磁盘中。
预处理(Pre-processing) -> 编译(Compiling) ->汇编(Assembling) -> 链接(Linking)
C++11中,可以使用
模板
参数包(
template
parameter pack)和可变参数
模板
函数
(variadic
function
template
)来实现可变参数
模板
。
模板
参数包是一种可以接受任意数量、任意类型的
模板
参数的机制,它使用`...`语法表示,例如:
template
<typename... Args>
void foo(Args... args)
// ...
上面的代码中,`Args`是一个
模板
参数包,它可以接受任意数量、任意类型的
模板
参数。
可变参数
模板
函数
是一种可以接受任意数量、任意类型的
函数
参数的机制,它使用
模板
参数包和
函数
参数包(
function
parameter pack)来实现。例如:
template
<typename... Args>
void bar(Args... args)
int n = sizeof...(Args); // 获取参数数量
std::cout << n << std::endl;
std::cout << (args + ...) << std::endl; // 展开参数序列,并求和
上面的代码中,`Args... args`是一个
函数
参数包,它可以接受任意数量、任意类型的
函数
参数。在
函数
体中,我们使用`sizeof...(Args)`来获取参数数量,并使用`(args + ...)`来展开参数序列,并求和。
需要注意的是,C++11中的可变参数
模板
只能用于
函数
模板
中,不能用于类
模板
中。如果想要在类
模板
中使用可变参数
模板
,可以使用
模板
特化的方式来实现。