C++学习之九

1)普通类的成员函数模板

class A
{
public:template<typename T> //类的成员函数模板,//成员函数模板和函数模板长得样子一样!void func(T tmp);
};template<typename T>
void A::func(T tmp)
{cout << tmp << endl;
}int main() 
{A a;a.func<double>(56.89);return 0;
}

2)模板类的成员函数模板

template<class T2>
class A
{
public:A(T2 arg):arg_(arg){}template<typename T> //类的成员函数模板void func(T tmp);
private:T2 arg_;
};//模板类的成员函数模板类外定义方法
template<class T2>
template<typename T>
void A<T2>::func(T tmp)
{cout << tmp + arg_ << endl;
}int main() 
{A<int> a1(45);a1.func<int>(45); //output 90return 0;
}

3)模板显式实例化,显式声明
显式实例化作用:为了防止多个.cpp文件生成相同的类模板,较少系统编译的开销;
实例化定义,实例化声明!
template A; //在多个.cpp文件中的其中任意一个文件中,实例化定义【只有一个】
extern template A; //在其他.cpp文件中,实例化声明【可以有多个】, 代表此文件不用在实例化
4)using定义模板别名(下面案例是定义map容器的类模板别名)
//using str_map_t = std::map<std::string, T> type;
//上面这句话,既不是函数模板,也不是类模板,是用using定义一个类型别名,也叫【类型模板】;

template<class T>
using str_map_t = std::map<std::string, T>; //类型模板,也叫模板别名int main() 
{str_map_t<int> m1;m1.insert({"abc",123});return 0;
}

4.1)用typedef在模板类中,重新定义新的类型,但无法重新定义一个模板!!!using可以,定义的名字叫类型模板;
template //C++98之前的写法
struct A
{
typedef std::map<string, T> mapType; //必须有typedef,否则会编译错误
};
int main()
{
A::mapType a1;
a1.insert({ “first”,23 });
return 0;
}

//typedef int myint_t; //用typedef定义别名,就好像定义一个变量一样!!!
typedef int(func)(int, int);
using funcptr = int(
)(int, int); //有using定义一个函数指针的写法
5)显示指定模板参数

template<class T1,class T2,class T3>
T1 func(T2 a, T3 b)
{return a + b;
}int main() 
{//auto ret = func(3, 6);这样写不行,因为T1没有类型,必须显示指定;auto ret = func<int>(3, 6);cout << ret << endl;return 0;
}

6)类模板全特化

说明:必须有泛化版本,才可以有特化版本!!!特化版本优先被编译;template<class T> //泛化版本
class A
{
public:bool compare(const T& tmp){cout << "一般模板" << tmp << endl;if (tmp > 2.5) return 1;}
};template<>
class A<float> //全特化版本,注意float绑定到类A上,注意写法!!!
{
public:bool compare(const float& tmp){cout << "全特化" <<tmp << endl;if (tmp > 2.5) return 1;}
};int main() 
{A<float> a;a.compare(4.7); //调用全特化版本A<int> a2;a2.compare(40); //泛化版本return 0;
}

7)特化成员函数而不是模板

注意:特化成员函数就一个类,这是跟模板类特化的重要区别!!!
class A
{
public:template<typename T>void func(T tmp);
};template<typename T> //成员函数的泛化版本
void A::func(T tmp)
{cout << "成员函数的泛化版本 " << tmp << endl;
}template<> //成员函数的特化版本
void A::func(int tmp)
{cout << "成员函数的特化版本 " << tmp << endl;
}int main() 
{A a;a.func<>(6); //调用的是特化版本a.func<float>(5.3); //调用的是泛化版本return 0;
}

8)类模板偏特化(也就局部特化)

//偏特化两方面:1)从模板参数数量上;2)模板参数范围上
template<class T,class U,class W>
class A //泛化类模板
{
public:A() { cout << "泛化版本 A constructor" << endl; }void func(void){ cout << "泛化版本 func" << endl; }
};template<class U,class W>
class A<int,U,W>
{
public:A() { cout << "偏特化版本1 A constructor" << endl; }void func(void) { cout << "偏特化版本1 func" << endl; }
};template<class T, class W>
class A<T, float, W>
{
public:A() { cout << "偏特化版本2 A constructor" << endl; }void func(void) { cout << "偏特化版本2 func" << endl; }
};int main() 
{A<char,int,int> a1; a1.func();//调用的是泛化版本A<int, int, int> a2;a2.func();//调用的是特化版本1return 0;
}

9)函数模板全特化,函数模板没有偏特化

template<typename T,typename U>
void func(T a, U b)
{cout << "函数模板泛化 " << a + b << endl;
}//以下5句代码用于不会执行!!!
template<typename T>
void func<T, double>(T a, double b) //函数模板偏特化,这是不可以的,编译不过去!!!!!!!!
{cout <<"函数模板偏特化--------------- "<< a + b << endl;
}template<>
void func<double,double>(double a, double b) //必须有“<double,double>”,如果没有,则本质上是函数重载;
{cout << "函数模板全特化--- " << a + b << endl;
}int main() 
{func<int,int>(3, 4.7); //调用的是泛化版本func<int,double>(4, 2.7);func<>(3.4, 5.6);//调用的是全特化版本return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/48744.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx代理webSocket链接,webSocket频繁断开重连

一、场景 1、使用nginx代理webSocket链接&#xff0c;消息发送和接收都是正常的&#xff0c;但webSocket链接会频繁断开重连 2、如果不使用nginx代理则一切正常 3、程序没有做webSocket心跳处理 如下图 二、nginx代理配置 upstream cloud_ass {#ip_hash;server 192.168.1.…

2023年国赛数学建模思路 - 案例:随机森林

文章目录 1 什么是随机森林&#xff1f;2 随机深林构造流程3 随机森林的优缺点3.1 优点3.2 缺点 4 随机深林算法实现 建模资料 ## 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 什么是随机森林&#xff…

leetcode做题笔记95. 不同的二叉搜索树 II

给你一个整数 n &#xff0c;请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。 思路一&#xff1a;递归 struct TreeNode ** partition(int start, int end, int* returnSize){*returnSize 0;int size 32;stru…

从2023年世界机器人大会发现机器人新趋势

机器人零部件为何成2023年世界机器人大会关注热门&#xff1f; 在原先&#xff0c;机器人的三大核心零部件是控制系统中的控制器、驱动系统中的伺服电机和机械系统中的精密减速器。如今&#xff0c;机器人的主体框架结构已经落实&#xff0c;更多机器人已经开始深入到各类场景中…

c++ std::sort的简单用法

直接看代码即可&#xff0c;对于lambda部分的解释&#xff1a;a,b基本算作两个抽象的比较对象&#xff0c;每次会比较这两个&#xff0c;返回true:表示a应该排在b前面(a<b)&#xff0c;返回false:表示b应该排在a前面(a>b)&#xff0c;具体可查看cpprefernece #include &…

Prompt本质解密及Evaluation实战(一)

一、基于evaluation的prompt使用解析 基于大模型的应用评估与传统应用程序的评估不太一样&#xff0c;特别是基于GPT系列或者生成式语言模型&#xff0c;因为模型生成的内容与传统意义上所说的内容或者标签不太一样。 以下是借用了ChatGPT官方的evaluation指南提出的对结果的具…

kali的一些使用和ms08-067、ms17-010漏洞

VM虚拟机-三种网络连接方式&#xff08;桥接、NAT、仅主机模式&#xff09; 虚拟机网络连接 一、Bridged&#xff08;桥接&#xff09; 二、NAT&#xff08;网络地址转换&#xff09; 三、Host-Only&#xff08;仅主机&#xff09; 在vmware软件中&#xff0c;选项栏的“编…

[计算机入门] 窗口操作

3.3 窗口操作 之前介绍过如何调整窗口大小。接下来介绍如何对窗口进行排布等操作。 当我们想要将某个窗口调整到整个屏幕的左边或者右边(占整个屏幕的一半)&#xff0c;可以在选中并激活窗口后&#xff0c;按Win ←/→ 进行调整。 此时&#xff0c;还可以通过Win↑/↓调整该…

微信小程序教学系列(3)

微信小程序教学系列 第三章&#xff1a;小程序高级开发技巧 1. 小程序API的使用 小程序API简介 小程序API是小程序提供的一系列接口&#xff0c;用于实现各种功能和操作。通过调用小程序API&#xff0c;可以实现页面跳转、数据存储、网络请求等功能。 使用小程序API的步骤…

ATFX汇市:杰克逊霍尔年会降至,鲍威尔或再发鹰派言论

环球汇市行情摘要—— 昨日&#xff0c;美元指数下跌0.11%&#xff0c;收盘在103.33点&#xff0c; 欧元升值0.22%&#xff0c;收盘价1.0898点&#xff1b; 日元贬值0.58%&#xff0c;收盘价146.23点&#xff1b; 英镑升值0.18%&#xff0c;收盘价1.2757点&#xff1b; 瑞…

Flutter GetXController 动态Tabbar 报错问题

场景&#xff1a; 1.Tabbar的内容是接口获取的 2. TabController? tabController;&#xff1b; 在onInit 方法中初始化tabbarController tabController TabController(initialIndex: 0, length: titleDataList.length, vsync: this); 这时候会报一个错误 Controllers l…

docker版jxTMS使用指南:使用jxTMS提供数据

本文讲解了如何jxTMS的数据访问框架&#xff0c;整个系列的文章请查看&#xff1a;docker版jxTMS使用指南&#xff1a;4.4版升级内容 docker版本的使用&#xff0c;请查看&#xff1a;docker版jxTMS使用指南 4.0版jxTMS的说明&#xff0c;请查看&#xff1a;4.0版升级内容 4…

微信小程序教学系列(8)

微信小程序教学系列 第八章&#xff1a;小程序国际化开发 欢迎来到第八章&#xff01;这一次我们要谈论的是小程序国际化开发。你可能会问&#xff0c;什么是国际化&#xff1f;简单来说&#xff0c;国际化就是让小程序能够适应不同的语言和地区&#xff0c;让用户们感受到更…

Python 合并多个 PDF 文件并建立书签目录

今天在用 WPS 的 PDF 工具合并多个文件的时候&#xff0c;非常不给力&#xff0c;居然卡死了好几次&#xff0c;什么毛病&#xff1f;&#xff01; 心里想&#xff0c;就这么点儿功能&#xff0c;居然收了我会员费都实现不了&#xff1f;不是吧…… 只能自己来了&#xff0c;…

导出pdf

该方法导出的pdf大小是A4纸的尺寸&#xff0c;如果大于1页需要根据元素高度进行截断的话&#xff0c;页面元素需要加 class ergodic-dom&#xff0c;方法里面会获取ergodic-dom元素&#xff0c;对元素高度和A4高度做比较&#xff0c;如果大于A4高度&#xff0c;会塞一个空白元素…

Android6:片段和导航

创建项目Secret Message strings.xml <resources><string name"app_name">Secret Message</string><string name"welcome_text">Welcome to the Secret Message app!Use this app to encrypt a secret message.Click on the Star…

maven 从官网下载指定版本

1. 进入官网下载页面 Maven – Download Apache Maven 点击下图所示链接 2. 进入文件页&#xff0c;选择需要的版本 3. 选binaries 4. 选文件&#xff0c;下载即可

JMETER基本原理

Jmeter基本原理是建立一个线程池&#xff0c;多线程运行取样器产生大量负载&#xff0c;在运行过程中通过断言来验证结果的正确性&#xff0c;可以通过监听来记录测试结果&#xff1b; JMETER是运行在JVM虚拟机上的&#xff0c;每个进程的开销比loadrunner的进程开销大&#x…

Windows系统下安装Nginx以及相关端口问题的解决方法详解

系列文章目录 安装Tomac服务器——安装步骤以及易出现问题的解决方法 文章目录 系列文章目录 一 背景 二 安装 2.1 下载Nginx 2.2 选择Nginx版本 2.3 解压Nginx 三 Nginx的使用 3.1 Nginx基本目录 3.2查看80端口是否被占用 3.3 Nginx启动方式 第一种&#xff1a;双…

飞天使-k8s基础组件分析-控制器

文章目录 控制器含义解释pod的标签与注释ReplicaControllerReplicaSetDeploymentsDaemonSetJobCronjob参考文档 控制器含义解释 空调遥控器知道吧ReplicationController: ReplicationController确保在任何时候都运行指定数量的pod副本。换句话说&#xff0c;一个ReplicationCo…