设为首页 加入收藏

TOP

函数模板,函数模板重载,可变参数模板,函数模板覆盖,通过引用交换数据
2015-07-20 17:53:53 来源: 作者: 【 】 浏览:2
Tags:函数 模板 重载 可变 参数 覆盖 通过 引用 交换 数据
??

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

#include

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

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

template

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);

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

add (a, b);

std::cin.get();

}

运行结果如下:

\

2.模板的重载,模板的重载会根据数据类型自动匹配<??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KCjxwIGFsaWduPQ=="left">#include

#include

using std::array;

template

void showarray(array myarray, int n)

{

using namespace std;

cout << "TTTTT" << endl;

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

{

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

}

cout << endl;

}

template

void showarray(array 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 intarray = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

array pintarray;

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

{

pintarray[i] = &intarray[i];

}

array 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

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

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

void showall(){}

template

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

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

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

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

struct info

{

char name[40];

double db;

int data;

};

template

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

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

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

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

template

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 (ch1, ch2);

std::cout << ch1 << " " << ch2 << std::endl;

std::cin.get();

}

\

6.可变参数模板

#include

#include

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

template

void show(T t, ...)

{

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

}

template

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();

}

运行结果如下:

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++中_onexit()用法简述 下一篇UVA10317- Equating Equations(回..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: