函数模板 将同一种算法应用与不同类型的函数时

#include<iostream>

#include<string> template

<typename T> void mymyswap(T &a, T &b);//每定义函数或者函数原型在前边都要加

template<typename name> int main()

{

using namespace std;

int i, j;

cin >> i >> j;

mymyswap(i, j);

cout << i<<" " << j;

}

template <typename T> void mymyswap(T &a, T &b)

//每定义函数或者函数原型在前边都要加

template<typename name> {

T temp; temp = a; a = b; b = temp;

}

2模板的局限性,假设传入数组,那么数组不能直接交换,要不然交换的就是地址,还有其他案例等,要根据情况使用模板

3显式具体化 :假设我们定义了一个结构体 在C++中,一个结构体可以直接赋值给另一个结构体 我们希望交换这个结构体的内容,可以使用 T temp; temp = a; a = b; b = temp;

在C++中,一个结构体可以直接赋值给另一个结构体 但是假设我们只想交换结构体实例化中两个中的floor或者floor和salary而不交换name成员,则需要不同的代码,需要额外写,函数重载也不能使用 然而可以提供一个具体化函数定义——成为显示具体化

定义: template <> 函数返回类型 函数名字 (参数), 而且必须先声明模板,才能进一步声明显式具体化函数

template <typename T> void myswap(T &, T &);

template <> void myswap<job>(job&, job&);//显式化原型

template <> void myswap<job>(job &a, job &b) {****************

}

下边将实现一个将结构体内信息部分调换的函数以及代码

template <typename T> void myswap(T &, T &);//函数模板

struct job //定义结构体

{ char name[40];

double salary;

int floor; };

template <> void myswap<job>(job&, job&);//在函数模板的基础上进一步定义显式化原型

template <> void myswap<job>(job &a, job &b) {

double t1;

int t2; //定义两个临时变量

t1 = a.salary;

a.salary = b.salary;

b.salary = t1;//交换两个结构体的salary变量

t2 = a.floor;

a.floor = b.floor;

b.floor = t2;//交换两个结构体的floor变量 }

void show(job& a)//将交换后的信息打印出来 {

using namespace std;

cout<< "名字:" << a.name <<endl;

cout <<"薪水:" << a.salary << endl;

cout <<"楼层:" <<a.floor << endl;

}

主函数

int main() {

using namespace std; job j1 = {"小明",5000,2};

job j2 = { "小红",8000,1 };

myswap(j1, j2);

show(j1);

show(j2);

}

函数模板 及显式具体化(C++)的更多相关文章

  1. C++语言基础(19)-模板的显式具体化

    应用背景: 例如有下面的函数模板,它用来获取两个变量中较大的一个: template<class T> const T& Max(const T& a, const T&a ...

  2. javascript内置函数提供的显式绑定

    内置函数提供的显式绑定 最近在开发中遇到使用arr.map(module.fun) 这样的写法时(在一个模块调用了另外一个模块的方法), 造成了函数中this丢失的问题, 显示为undefined, ...

  3. C++基础--函数模板

    函数模板是通用的函数描述,其使用泛型来定义函数.其实就是有些操作,如果撇开具体的变量的数据类型,其操作是一样的如果我们将这些操作写成一个模板,在调用不同变量的时候就设定好变量类型就可了,后续的操作基本 ...

  4. C++ 函数重载,函数模板和函数模板重载,选择哪一个?

    重载解析 在C++中,对于函数重载.函数模板和函数模板重载,C++需要有一个良好的策略,去选择调用哪一个函数定义(尤其是多个参数时),这个过程称为重载解析. (这个过程将会非常复杂,但愿不要遇到一定要 ...

  5. C++-函数模板特化如何避免重复定义

     我正在用一个基于模板的库源代码,该库包含一些针对特定类型的模板函数特化.类模板,函数模板和模板函数特化都在头文件中.我在我的.cpp文件中 #include 头文件并编译链接工程.但是为了在整个工程 ...

  6. C++模板之函数模板实例化和具体化

    模板声明 template<typename/class T>,  typename比class最近后添加到C++标准. 常规模板,具体化模板,非模板函数的优先调用顺序. 非模板函数(普通 ...

  7. C++模板之隐式实例化、显示实例化、隐式调用、显示调用和模板特化详解

    模板的实例化指函数模板(类模板)生成模板函数(模板类)的过程.对于函数模板而言,模板实例化之后,会生成一个真正的函数.而类模板经过实例化之后,只是完成了类的定义,模板类的成员函数需要到调用时才会被初始 ...

  8. C++函数模板详解(一):概念和特性

    函数模板是指这样的一类函数:可以用多种不同数据类型的参数进行调用,代表了一个函数家族.它的外表和普通的函数很相似,唯一的区别就是:函数中的有些元素是未确定的,这些元素将在使用的时候才被实例化.先来看一 ...

  9. C++模板显式实例化,隐式实例化,特化(具体化,偏特化)辨析

    最近再次看C++ PRIMER PLUS的时候看到这个部分感觉讲得很烂,前后口径不一致,所以写个辨析让自己明白的同时也希望对此不太清楚的朋友能搞懂. 总结一下,C++只有模板显式实例化(explici ...

  10. C++学习笔记36 (模板的细节明确template specialization)和显式实例(template instantiation)

    C++有时模板很可能无法处理某些类型的. 例如: #include <iostream> using namespace std; class man{ private: string n ...

随机推荐

  1. 使用Deployment和Service实现简单的灰度发布

    在Kubernetes中,使用单个Service和多个Deployment来实现灰度发布的一种常见方法是利用标签(Labels)和选择器(Selectors)来控制哪些Pods接收来自Service的 ...

  2. 简洁版docker跑mongo

    参考,欢迎点击原文:https://www.runoob.com/docker/docker-install-mongodb.html(菜鸟) 以下是拉取docker镜像并运行起来 docker pu ...

  3. 京东Linux 运维工程师面试真题

    京东Linux 运维工程师面试真题 首先我们来看下京东 Linux 运维工程师招聘岗位要求: [岗位定义]运维工程师 [岗位薪资]10K-20K [基本要求]北京 / 经验 3-5 年 / 本科及以上 ...

  4. 从时间复杂度的角度出发,list和vector之间查找,插入,删除等数据操作的区别

    list和vector是STL(标准模板库)中常用的两种序列容器,它们各自在不同类型的操作上有着不同的优势.下面是list和vector在不同操作上的擅长之处: list的擅长操作 插入和删除操作:l ...

  5. drools中使用全局变量

    一.背景 在我们编写drools的规则文件的时候,有些时候需要用到全局变量,那么这个该怎么实现呢?有哪些注意事项呢? 二.前置知识 1.语法结构 2.全局变量的特点 使用global来定义全局变量,它 ...

  6. Nancy一个轻量级用于构建基于 HTTP 的 Web 服务

    记录一下: Nancy官网地址:http://nancyfx.org/ GitHub文档地址:https://github.com/NancyFx/Nancy/wiki/Documentation 有 ...

  7. KingbaseES V8R6 运维案例 -- sys_filenode.map故障案例

    ​ 案例说明: 数据库下的sys_filenode.map文件被破坏,导致此数据库无法连接访问. Nail表(内核系统表)Relfilenode的存储机制: 经过研究发现,在数据目录里存在着pg_fi ...

  8. NET Core使用Grpc通信(一):一元

    gRPC是一个现代的开源高性能远程过程调用(RPC)框架,它可以高效地连接数据中心内和跨数据中心的服务,支持负载平衡.跟踪.运行状况检查和身份验证. gRPC通过使用 Protocol Buffers ...

  9. Linux下Bochs,NASM安装和使用

    安装环境 以Ubuntu为例,先更新一下: sudo apt-get update sudo apt-get upgrade 然后安装Bochs环境: sudo apt-get install bui ...

  10. SQLAlchemy详解

    一.SQLAlchemy介绍 SQLAlchemy 是 Python SQL 工具包和对象关系映射器,为应用程序开发人员提供 SQL 的全部功能和灵活性. SQLAlchemy支持SQLite.Pos ...