首页 > 编程语言 >C++之模板

C++之模板

时间:2024-11-10 09:17:18浏览次数:3  
标签:int C++ 类型 second 参数 Pair 模板

C++模板是一种支持泛型编程的机制,允许开发者定义使用任意类型作为参数的函数和类。模板提供了代码复用和类型安全的抽象,使得同一段代码可以用于不同的数据类型。

函数模板

定义和使用

函数模板是一种可以接受任意类型参数的函数。它通过在函数声明中使用模板参数(用尖括号<>包围)来定义。

template <typename T>
void print(T value) {
    std::cout << value << std::endl;
}

使用函数模板时,编译器在编译期间根据传入的参数类型自动实例化模板。

print(10);    // int类型实例化
print(3.14);  // double类型实例化
print("Hello");// char* 类型实例化
模板参数的默认值

在C++17中,你可以为模板参数指定默认值。如果调用者没有指定模板参数,编译器将使用默认值。

template <typename T = int>
void print(T value) {
    std::cout << value << std::endl;
}

这样,即使不指定模板参数类型,print函数默认使用int类型。

类模板

定义和使用

类模板是一种可以接受任意类型作为参数的类。它通过在类声明中使用模板参数来定义。

template <typename T, typename U = int>
class Pair {
public:
    T first;
    U second;
    Pair(T f, U s) : first(f), second(s) {}
};

使用类模板时,编译器在编译期间根据传入的参数类型自动实例化模板。

Pair<int, double> intDoublePair(1, 2.0); // int类型first,double类型second
Pair<float> floatPair(3.0f);           // float类型first,默认int类型second
模板特化

模板特化是为特定的模板参数提供特定实现的过程。它允许开发者为通用模板提供一个或多个特定的实现。

  • 全特化:为特定的模板参数提供完整的类定义。
template <>
class Pair<int, int> {
public:
    int first, second;
    Pair(int f, int s) : first(f), second(s) {}
};

这个特化定义了一个Pair<int, int>的特定实现。

  • 偏特化:为部分模板参数提供特定的类定义,其他参数保持模板形式。
template <typename T>
class Pair<T, int> {
public:
    T first;
    int second;
    Pair(T f, int s) : first(f), second(s) {}
};

这个偏特化为所有second类型为intPair提供了特定的实现。

模板特化提供了灵活性,允许开发者为特定的类型或类型组合提供优化或特定的实现。使用模板特化时,需要小心处理模板的匹配和选择,以避免歧义。

标签:int,C++,类型,second,参数,Pair,模板
From: https://blog.csdn.net/weixin_42300449/article/details/143560175

相关文章

  • C++之vector 容器的使用
    在C++中,std::vector是一个非常灵活且常用的容器,它提供了动态数组的功能。以下是一些基本的使用方式:包含头文件要使用std::vector,首先需要包含头文件<vector>。#include<vector>创建vector//创建一个空的vectorstd::vector<int>vec;//创建一个vector并初始化......
  • C++之智能指针
    智能指针是C++中的一种资源管理工具,用于自动管理动态分配的内存。它们通过在不再需要时自动释放内存来防止内存泄漏。C++标准库提供了几种不同类型的智能指针,每种都有其特定的用途和行为。主要的智能指针类型std::unique_ptrstd::shared_ptrstd::weak_ptr1. std::unique_pt......
  • Open3D (C++) 旋转矩阵转欧拉角公式推导及过程实现
    目录一、概述1.1原理1.2实现步骤1.3应用场景1.4注意事项二、关键函数2.1头文件2.2主要函数三、完整代码三、结果展示一、概述  将旋转矩阵转换为欧拉角是逆向理解三维对象姿态的一种方法。旋转矩阵是一个3x3的正交矩阵,它描述了在三维空......
  • C++-练习-67
    题目:考虑下面的结构声明structcustomer{        charfullname[35];        doublepayment;};编写一个程序,它从栈中添加和删除customer结构(栈用Stack类声明)。每次customer结构被删除时,其payment的值都被添加到总数中,并报告总数。源代码:test.h#if......
  • C++代码优化(二): 区分接口继承和实现继承
    目录1.引言2.接口继承3.实现继承4.如何选择接口继承与实现继承5.完整实例6.总结1.引言        在C++中,区分接口继承和实现继承是一种良好的编程实践,有助于提高代码的可维护性、可读性和可扩展性。接口继承通常指的是从基类继承纯虚函数(purevirtualfunctions......
  • 华为OD机试2024年E卷-MVP争夺战[100分]( Java | Python3 | C++ | C语言 | JsNode | Go
    题目描述在星球争霸篮球赛对抗赛中,最大的宇宙战队希望每个人都能拿到MVP,MVP的条件是单场最高分得分获得者。可以并列所以宇宙战队决定在比赛中尽可能让更多队员上场,并且让所有得分的选手得分都相同,然而比赛过程中的每1分钟的得分都只能由某一个人包揽。输入描述输入第一行......
  • 华为OD机试2024年E卷-AI识别面板[100分]( Java | Python3 | C++ | C语言 | JsNode | Go
    题目描述AI识别到面板上有N(1≤N≤100)个指示灯,灯大小一样,任意两个之间无重叠。由于AI识别误差,每次别到的指示灯位置可能有差异,以4个坐标值描述AI识别的指示灯的大小和位置(左上角x1,y1,右下角x2,y2),请输出先行后列排序的指示灯的编号,排序规则:每次在尚未排序的灯中挑选最高的......
  • 【C++】详细介绍:priority_queue的使用、适配器、deque介绍、仿函数
    目录一、介绍二、使用三、函数模版和类模板的区别四、适配器1、适配器适配栈扩展:2、deque(双端队列)缺省模版五、仿函数一、介绍(1)、priority_queue称为优先级队列,是一种容器适配器,不是队列也不是容器。(2)、该结构的底层是堆结构,默认是大堆,用模版参数来区分是大堆......
  • c++中使用using namespace的命名空间污染问题
    如果 a.h 中使用了 usingnamespaceaa;,并且 b.cpp 包含了 a.h,那么在 b.cpp 中可以直接使用 aa 命名空间中的内容,因为 usingnamespaceaa; 会被一并包含进来。解释usingnamespace 会将指定命名空间中的所有符号引入当前作用域。当 b.cpp 包含 a.h 时,a.h 中......
  • C++和C中的结构体兼容问题Anonymous non-C-compatible type given name for linkage p
    这个编译错误消息指的是,在typedef声明中引入了一个匿名非C兼容类型,编译器为了链接处理给它了一个名字,但它建议添加一个标签名称来显式命名该类型,以便更好地支持C语言的兼容性和跨文件链接。问题原因在C++中,匿名结构体和匿名联合体是合法的,它们可以在没有显式名称的情况下......