【cpp】模板函数 模板类 特化 书写格式备忘

news2024/10/12 2:56:26

outline

收集的关于使用 模板函数 模板类 特化 偏特化的笔记 用以快速回忆

模板类

普通使用 类内定义成员函数

#include <iostream>
using namespace std;

template <typename T>
class MyContainer {
private:
    T element;

public:
    MyContainer(T elem) : element(elem) {}
    
    void display() {
        cout << "Element: " << element << endl;
    }
};
int main() {
    MyContainer<int> intContainer(5);
    intContainer.display(); 

    MyContainer<string> stringContainer("Hello");
    stringContainer.display(); 

    return 0;
}

在这里插入图片描述

普通使用 类外定义成员函数

#include <iostream>
using namespace std;

template <typename T>
class MyContainer {
private:
    T element;

public:
    MyContainer(T elem) : element(elem) {}

    void display();
};


template <typename T>
void MyContainer<T>::display() {
    cout << "Element: " << element << endl;
}

int main() {
    MyContainer<int> intContainer(5);
    intContainer.display(); 

    MyContainer<string> stringContainer("Hello");
    stringContainer.display(); 

    return 0;
}

在这里插入图片描述

类的全特化

#include <iostream>
using namespace std;

template <typename T>
class MyContainer {
private:
    T element;

public:
    MyContainer(T elem) : element(elem) {}

    void display();
};


template <typename T>
void MyContainer<T>::display() {
    cout << "Element: " << element << endl;
}

template <>
class MyContainer<int> {
private:
    int element;

public:
    MyContainer(int elem) : element(elem) {}
    void display() {
        cout << "Element is an integer: " << element << endl;
    }
};

int main() {
    MyContainer<int> intContainer(5);
    intContainer.display(); 

    MyContainer<double> doubleContainer(3.14);
    doubleContainer.display(); 

    return 0;
}

在这里插入图片描述

类的偏特化

#include <iostream>
using namespace std;

template <typename T, typename U>
class MyPair {
private:
    T first;
    U second;

public:
    MyPair(T f, U s) : first(f), second(s) {}
    void display() {
        cout << "First: " << first << ", Second: " << second << endl;
    }
};

// 偏特化为第二个参数为 int 的情况
template <typename T>
class MyPair<T, int> {
private:
    T first;
    int second;

public:
    MyPair(T f, int s) : first(f), second(s) {}
    void display() {
        cout << "First: " << first << ", Second (int): " << second << endl;
    }
};

int main() {
    MyPair<string, double> myPair1("Hello", 3.14);
    myPair1.display();  

    MyPair<string, int> myPair2("World", 10);
    myPair2.display();  

    return 0;
}


在这里插入图片描述

特别说明

当在模板类的成员函数中调用其他模板成员函数时。
当需要指定特定的模板参数时。
要把

doubleContainer.display();

写成

doubleContainer.template display();
#include <iostream>
using namespace std;

template <typename T>
class MyContainer {
private:
    T element;

public:
    MyContainer(T elem) : element(elem) {}

    // 模板成员函数
    template <typename U>
    U add(U value) {
        return element + value; // 这里假设 element 可以与 U 类型相加
    }

    void display() {
        cout << "Element: " << element << endl;
    }
};

int main() {
    MyContainer<int> intContainer(5);
    intContainer.display(); 

    // 调用模板成员函数
    cout << "Sum: " << intContainer.template add<double>(2.5) << endl; //使用 template 关键字

    return 0;
}

在这里插入图片描述

函数模板的全特化

函数模板没有偏特化,可以通过重载函数来处理不同的参数类型或数量,从而模拟偏特化的效果,理由是为了避免复杂性和潜在的歧义性,同时通过重载和全特化提供了足够的灵活性和功能。

函数的全特化

#include <iostream>
using namespace std;

#include <iostream>
using namespace std;

template <typename T>
T add(T a, T b) {
    return a + b;
}

template <>
int add<int>(int a, int b) {
    cout << "Using specialized version for int" << endl;
    return a + b;
}

int main() {
    cout << "Sum of integers: " << add<int>(3, 4) << endl; 
    cout << "Sum of doubles: " << add<double>(3.5, 2.5) << endl;

    return 0;
}

在这里插入图片描述

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

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

相关文章

低代码可视化-uniapp商城首页小程序-代码生成器

在设计一个小程序的首页时&#xff0c;包含轮播图、通知栏和商品列表这三个元素是非常常见且有效的布局方式。这样的设计既能够吸引用户的注意力&#xff0c;又能够高效地展示信息和商品。 轮播组件 小程序首页幻灯片通常位于小程序的顶部或显著位置&#xff0c;通过滑动屏幕可…

selenium自动化测试之Junit

1. 常用的注解 将junit的索引添加到pom文件&#xff1a; <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId&…

看镭速如何解决半导体行业跨国传输大文件效率低的难题

随着全球经济的融合&#xff0c;半导体行业迎来了迅猛的发展&#xff0c;跨国合作变得司空见惯。相应地&#xff0c;跨国大文件传输的需求也在持续增长。不过&#xff0c;半导体行业在跨国传输大文件时&#xff0c;常常遇到效率不高和安全难以保障的问题。因此&#xff0c;半导…

H3C IPsec+IKE 野蛮模式配置实验

H3C IPsecIKE 野蛮模式配置实验 实验拓扑 ​​ 实验需求 按照图示配置 IP 地址&#xff0c;R3出接口自动获取公网IP地址在 R1 上配置默认路由连通公网在 R1 和 R3 上配置 IPsec VPN&#xff0c;使两端私网可以互相访问 实验步骤 按照图示配置 IP 地址&#xff0c;R3出接口…

上传图片到github上,生成链接在Typora中使用(解决Typora的md文件在分享时的丢失问题)

上传图片到github上,生成链接在Typora中使用(解决Typora的md文件在分享时的丢失问题) 在GitHub上从操作 创建一个 GitHub 仓库: 登录 GitHub,创建一个新的仓库来存储图片。 生成 GitHub 令牌: 在 GitHub 中,前往“Settings” > “Developer settings” > “Pers…

Rpc框架开发——客户端框架设计

目录 一、Requestor 二、RpcCaller 三、Publish_Subscribe 四、Registry-Discovery 五、Client 在客户端的模块划分中&#xff0c;基于以上理解的功能&#xff0c;可以划分出这么几个模块 Protocol&#xff1a;应用层通信协议模块 Network&#xff1a;网络通信模块 Disp…

前端vue部署网站

这里讲解一下前端vue框架部署网站&#xff0c;使用工具是 xshell 和 xftp &#xff08;大家去官网安装免费版的就行了&#xff09; 服务器 我使用的阿里云服务器&#xff0c;买的是 99 一年的&#xff0c;淘宝有新手9.9 一个月服务器。可以去用&#xff0c;学生的话是有免费三…

进程状态|进程优先级

目录 一、进程状态 1.什么是进程状态 2.进程状态都包含什么&#xff1f; 3.进程状态的查看 4.进程退出 &#xff08;1&#xff09;进程退出的步骤 &#xff08;2&#xff09;僵尸进程 &#xff08;3&#xff09;孤儿进程 二、进程优先级 1.进程优先级是什么&#xff…

二分查找一>0~n-1中缺失的数字(点名)

1.题目&#xff1a; 2.解析&#xff1a;方法一&#xff1a;用哈希表&#xff1a;记录存在的数字&#xff0c;找到哈希表为空的数字输出 Set<Integer> set new HashSet<>();for(int x : records) set.add(x);for(int i 0; i < set.size(); i){if(!set.contain…

重新学习Mysql数据库3:Mysql存储引擎与数据存储原理

本文转自互联网 本系列文章将整理到我在GitHub上的《Java面试指南》仓库&#xff0c;更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客&#xff1a; www.how2playlife.com 本文是微信公众号【Java技术江湖…

STM32与QT实现串口传输结构体含源码

文章目录 一. 关于数据传输的方式1.1 基本数据类型传输1.2 结构体传输 二. STM32与QT实现串口传输结构体实例2.1 下位机的实现2.2 上位机的实现2.3 演示Demo 三. 注意事项3.1 关于字节对齐问题3.2 关于大小端问题 一. 关于数据传输的方式 在日常开发过程中&#xff0c;我们时常…

使用aloam跑hesai Pandar-XT32激光雷达数据

参考自利用aloam跑数据集_aloam数据集-CSDN博客 第一步&#xff1a;查看bag的信息 输入rosbag info来查看bag包的信息&#xff1a; joeyjoey-Legion-Y7000P-IRX9:~$ rosbag info /home/joey/Downloads/data2022/indoor/LiDAR_IMU.bag path: /home/joey/Downloads/da…

Java_EE 多线程技术(Thread)

多线程与并发编程 多线程介绍什么是程序&#xff1f;程序&#xff08;Program&#xff09;是一个静态的概念&#xff0c;一般对应于操作系统中的一个可执行文件。什么是进程?执行中的程序叫做进程(Process)&#xff0c;是一个动态的概念。其实进程就是一个在内存中独立运行的程…

2025秋招倒计时---招联金融

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

股市期市内外盘高频分钟tick及均线策略分享

【数据库】银河金融数据库&#xff08;yinhedata.com&#xff09;可以获取大量历史行情数据&#xff0c;包含分钟&#xff0c;tick&#xff0c;日。不限于国内外&#xff0c;股票期货基金&#xff0c;ETF、期权等 【策略分享】一、引言均线策略作为技术分析的重要工具&#xff…

Kubesphere4.1插件网关、devops控制页面白页面问题解决

在使用Kubesphere4.1版本时&#xff0c;安装完成devops插件后‘DevOps项目’管理页面出现白页面&#xff0c;无法进行配置。包括网关等控制页面都会出现白页面。 经过查看版本信息发现是4.1版本存在问题&#xff0c;目前不支持。 处理问题&#xff1a; 目前 Kubesphere发布了4…

【软件测试】最佳软件测试基础入门教程

目录 前言一、顺序式开发模型二、 瀑布模型三 、V型模型四、迭代和增量开发模型五、 项目和产品背景下的软件开发 前言 软件开发生命周期的测试 本章简要介绍了软件开发项目中常用的生命周期模型&#xff0c;并解释了测试在每个模型中扮演的角色。它讨论了各种测试级别和测试…

python-PyQt项目实战案例:制作一个简单的图像处理工具

文章目录 1.设计UI2.编写功能代码2.1 初始化ui界面及类成员参数2.2 添加菜单栏2.3 建立信号/槽连接 3.主要功能代码及效果4.设置图像自动调节长宽尺寸但不改变长宽比例参考文献 1.设计UI 对于UI的设计可以通过qt designer直接绘制&#xff0c;也可以通过编写python代码实现。当…

10万+收藏!10万转发!AI绘画如何助力育儿赛道引爆短视频平台?

在自媒体领域&#xff0c;内容创作的竞争日益激烈&#xff0c;但育儿自媒体一直是一块热门且持久的“金矿”&#xff0c;吸引了无数创作者投身其中。然而&#xff0c;如何在这片红海中脱颖而出&#xff0c;成为了许多创作者面临的难题。而AI绘画的出现&#xff0c;无疑解决了创…

约束使用方法:

设置主键&#xff1a; 该列的值用来唯一标识表中每一行&#xff0c;用于强制表的实体完整性。这样的列定义为表的主键&#xff0c;也就是说主键的列中不允许有相同的数据。 设置默认&#xff1a; CREATE TABLE pet( #not null 非空 ZEROFILL 补零 先补零&#xff0c;在非空 id…