函数模板,函数模板重载,可变参数模板,函数模板覆盖,通过引用交换数据



1.函数模板初级,如果想使用模板,需要实例化,实例化的方式是加上<数据类型>

#include
<iostream>

 

//函数模板可以对类型进行优化重载,根据类型会覆盖

//如果仍然要使用模板函数,需要实例化

 

template<class
T>

T
add(T
a,
T
b)

{

   
std::cout
<< "T add " <<
std::endl;

   
return
a +
b;

}

 

int
add(int
a,
int
b)

{

   
std::cout
<< "int add " <<
std::endl;

   
return
a +
b;

}

 

void
main()

{

   
int
a = 10,
b = 20;

   
double
db1 = 10.9,
db2 = 10.8;

   
add(db1,
db2);

   
add(a,
b);

   
//这里加上了<int>相当于实例化,调用了模板

   
add<int>(a,
b);

 

   
std::cin.get();

}

运行结果如下:

2.模板的重载,模板的重载会根据数据类型自动匹配

#include
<iostream>

#include
<array>

using
std::array;

 

template<typename
T>

void
showarray(array<T,
10> myarray,
int
n)

{

   
using
namespace
std;

   
cout <<
"TTTTT" <<
endl;

   
for (int
i = 0;
i <
n;
i++)

   
{

       
cout <<
myarray[i]
<< " ";

   
}

   
cout <<
endl;

}

 

template<typename
T>

void
showarray(array<T*,
10> myarray,
int
n)

{

   
using
namespace
std;

   
cout <<
"T*T*T*T*T*" <<
endl;

   
for (int
i = 0;
i <
n;
i++)

   
{

       
cout << *myarray[i]
<< " 
";

   
}

   
cout <<
endl;

}

 

void
main()

{

   
array<int,
10> intarray = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

   
array<int*,
10> pintarray;

   
for (int
i = 0;
i < 10;
i++)

   
{

       
pintarray[i]
= &intarray[i];

   
}

   
array<int**,
10> ppintarray;

   
for (int
i = 0;
i < 10;
i++)

   
{

       
ppintarray[i]
= &pintarray[i];

   
}

   
showarray(intarray,
10);

   
showarray(pintarray,
10);

   
showarray(ppintarray,
10);

 

   
std::cin.get();

}

运行结果如下:

3.通用函数可变参数模板

#include
<iostream>

 

//通用可变参数模板   
处理不限定个数的参数,处理不同类型

 

//空函数,接口,用于最后结束递归 适用于新版本的编译器

void
showall(){}

 

template<typename
T,
typename...Args>

void
showall(const
T &value,
const
Args &...args)

{

   
std::cout
<< value <<
std::endl;

   
showall(args...);  
//继续传递

}

 

//设计可以修改原来的数据的T &value, 
Args&...args

//设计可以修改副本  
T value,  Args ...args

//设计不可以修改原来的数据,不可以修改副本const T value, 
const Args...args

//设计引用原来的数据不可以修改 const 
T &value,  const Args &...args

 

void
main()

{

   
int
num1 = 10,
num2 = 9,
num3 = 11;

   
double
db1 = 10.8,
db2 = 10.9;

   
char
str[40] =
"yincheng";

   
char
ch =
'A';

   
showall(num1);

   
std::cout
<< "\n";

   
showall(num1,
num2,
num3);

   
std::cout
<< "\n";

   
showall(db1,
db2,
num1,
ch);

   
std::cout
<< "\n";

   
showall(db1,
db2,
num1,
ch,
str);

 

   
std::cin.get();

}

运行截图如下:

4.函数模板覆盖,并实现参数互换

#include
<iostream>

 

//函数模板实现通用,可以根据自有数据类型,进行优化

 

//结构体和类没有私有变量时才可以直接赋值初始化

//所有成员都是公有的类型可以赋值初始化

 

struct
info

{

   
char
name[40];

   
double
db;

   
int
data;

};

 

template<typename
T>

void
swap(T
&a,
T &b)

{

   
std::cout
<< "通用函数模板"
<< std::endl;

   
T
temp =
a;

   
a =
b;

   
b =
temp;//交换变量

}

 

//模板为空,明确参数类型,覆盖函数模板的类型

//template<>  
//这里可有可无

void
swap(info
&info1,
info &info2)

{

   
std::cout
<< "特有函数模板"
<< std::endl;

   
//通过模板可以实现通用,针对自己的数据类型做出优化

   
info
temp =
info1;

   
info1 =
info2;

   
info2 =
temp;

}

 

void
main()

{

   
info
info1 = {"tuzuoquan",20.9,10};

   
info
info2 = {
"quanzuotu",9.2,1 };

   
swap(info1,
info2);

   
std::cout
<< info1.name
<< info1.db
<< info2.data
<< std::endl;

   
std::cout
<< info2.name
<< info2.db
<< info2.data
<< std::endl;

   
std::cin.get();

}

运行结果:

5.通过引用的方式实现参数互换

#include
<iostream>

 

//函数模板实现通用,可以根据自有数据类型,进行优化

 

//结构体和类没有私有变量时才可以直接赋值初始化

//所有成员都是公有的类型可以赋值初始化

template<typename
T>

void
swap(T
&a,
T &b)

{

   
std::cout
<< "通用函数模板"
<< std::endl;

   
T
temp =
a;

   
a =
b;

   
b =
temp;//交换变量

}

 

void
main()

{

   
int
num1 = 100;

   
int
num2 = 10;

   
swap(num1,
num2);//实现交换

   
std::cout
<< num1 <<

" <<
num2 <<
std::endl;

   
char 
ch1 =
'Z';

   
char 
ch2 =
'A';

   
//注意,要指定使用模板,这里要使用<类型名称>

   
swap<char>(ch1,
ch2);

   
std::cout
<< ch1 <<

" <<
ch2 <<
std::endl;

 

   
std::cin.get();

}

6.可变参数模板

#include
<iostream>

#include
<cstdarg>

 

void
showall(){} 
//预留一个

 

template <typename
T>

void
show(T
t, ...)

{

   
std::cout
<< t <<
std::endl;

}

template <typename
T,
typename...Args>

void
showall(T
t,
Args...args)

{

   
std::cout
<< t <<
std::endl;

   
showall(args...);

}

 

void
main()

{

   
int
num1 = 10,
num2 = 9,
num3 = 11;

   
double
db1 = 10.8,
db2 = 10.9;

   
char
str[40] =
"yincheng";

   
char
ch =
'A';

   
show(num1);

   
showall(num2,
num3);

   
showall(num2,
num3,
num1,
str,
ch);

 

   
std::cin.get();

}

运行结果如下:

 

 

 

时间: 2024-09-24 16:27:16

函数模板,函数模板重载,可变参数模板,函数模板覆盖,通过引用交换数据的相关文章

可变参数的函数的原理

原文地址: 可变参数. 1:必须有一个提前参数,(即:...之前必须要有一个参数),用以计算出后面的第一个未知参数的地址. 知道了第一个未知参数的地址之后, 就可以根据fmt格式化串,可以依次计算出剩余的参数地址. sprintf()的原型:sprintf(char* buffer, const char* fmt, ... ) ,其中,fmt就是提前参数 2:每一个可变阐述函数,其编写者与使用者 都要有一个参数的使用约定.不然,会乱套. 3:可变函数实现的技术基础1:所有参数,在汇编级别,其大

c/c++支持可变参数的函数

一.为什么要使用可变参数的函数? 一般我们编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数.但在某些情况下希望函数的参数个数可以根据需要确定,因此c语言引入可变参数函数.这也是c功能强大的一个方面,其它某些语言,比如fortran就没有这个功能. 典型的可变参数函数的例子有大家熟悉的printf().scanf()等. 二.c/c++如何实现可变参数的函数? 为了支持可变参数函数,C语言引入新的调用协议, 即C语言调用约定 __cdecl . 采用C/

C语言利用va_list、va_start、va_end、va_arg宏定义可变参数的函数

在定义可变参数的函数之前,先来理解一下函数参数的传递原理: 1.函数参数是以栈这种数据结构来存取的,在函数参数列表中,从右至左依次入栈. 2.参数的内存存放格式:参数的内存地址存放在内存的堆栈段中,在执行函数的时候,从最后一个(最右边)参数开始入栈.因此栈底高地址,栈顶低地址,举个例子说明一下: void test(int a, float b, char c); 那么,在调用test函数的时候,实参char c先进栈,然后是float b,最后才是int a,因此在内存中变量的存放次序是c->

Lua中的函数(function)、可变参数、局部函数、尾递归优化等实例讲解_Lua

一.函数 在Lua中,函数是作为"第一类值"(First-Class Value),这表示函数可以存储在变量中,可以通过参数传递给其他函数,或者作为函数的返回值(类比C/C++中的函数指针),这种特性使Lua具有极大的灵活性.   Lua对函数式编程提供了良好的支持,可以支持嵌套函数.   另外,Lua既可以调用Lua编写的函数,还可以调用C语言编写的函数(Lua所有的标准库都是C语言写的).   定义一个函数 复制代码 代码如下: function hello() print('he

C++函数的可变参数详谈

可变参数的英文表示为:variable argument. 它在函数的定义时,用三个点号'.'表示,用逗号与其它参数分隔. 可变参数的特点:不像固定参数那样一一对应,也不像固定参数有固定的参数类型和参数名称;可变参数中个数不 定可是传入的是一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有 实际的名称与之相对应. 由此可见,可变参数的形式非常自由而富有弹生.因些,它给那些天才程序员有更大地想象和发挥空间. 然而,更多地自由,同样也加大操作上的难度. 以

C语言中实现可变参数函数

通过stdarg.h头文件为函数提供了定义可变参数列表的能力.声明一个可变参数的函数类似: void f1(int n,...); 其中n表示参数列表个数,而用省略号来表示未知参数列表.stdarg.h中提供了一个va_list类型,用于存放参数.一个大概的使用过程类似: void f1(int n,...) {    va_list ap;    va_start(ap,n);   //初始化参数列表    double first=va_arg(ap,double);  //取第一个参数  

Swift中的可变参数函数介绍_Swift

可变参数函数指的是可以接受任意多个参数的函数,我们最熟悉的可能就是 NSString 的 -stringWithFormat:方法了.在 Objective-C 中,我们使用这个方法生成字符串的写法是这样的: 复制代码 代码如下: NSString *name = @"Tom"; NSDate *date = [NSDate date]; NSString *string = [NSString stringWithFormat:                 @"Hell

c-可变参数的函数的使用问题

问题描述 可变参数的函数的使用问题 现在我有个可变参数的函数,具体如下: void WriteLog(wchar_t * szLog,...) { va_list arg_ptr; va_start(arg_ptr,szLog); fwprintf(fp,szLog,arg_ptr); fwprintf(fp,L"nnn"); va_end(arg_ptr); } 然后还有个函数调用这个函数 int main() { wchar_t str[STR_NUM]=L"hello&

JS中使用apply方法通过不同数量的参数调用函数的方法_javascript技巧

apply()方法定义 函数的apply()方法和call方法作用相同,区别在于接收的参数的方式不同. apply()方法接收两个参数,一个是对象,一个是参数数组. apply()作用 1.用于延长函数的作用域 示例: var color='red'; var o={color:'blue'}; function sayColor(){ console.log(this.color); } sayColor();//"red" sayColor.apply(o);//"blu