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

C++模板

时间:2024-05-05 14:00:11浏览次数:20  
标签:temp int double void C++ Swap template 模板

C++模板

C++是一个面向对象编程的语言,提供了类的继承和组合机制,虽然在层次结构上很简单,但使用起来非常糟糕。C++使用关键字template,告诉编译器声明的类或者对象是一个模板。模板不是像继承和组合那样重用目标代码,而是重用源代码。容器不再包含名为 Object 的泛型基类,而是包含未指定的参数。与C语言中的宏定义有点类似,编译器可以将参数替换所需要的类型,使用模板比使用宏更加清晰和简单。

参考:Thinking in C++, Chapter 16

模板重载

模板语法:template <typename/class T> void func(T &, T &);

其中typename和class都可以表示类或者原始类型(int、double、char等),后面是函数函数返回类型void,函数名func,参数类型为T&,编译器会将T&转为所需要的类型,如int&、double&。

#include <iostream>

using namespace std;

/****************************/
//template overloading

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

template <typename T>
void Swap(T *a, T *b, int);

/****************************/

int main()
{
    int a = 5, b = 7;
    Swap(a, b);     
    cout << "a:" << a << ", b:" << b <<endl;

    double c = 5.6, d = 7.8;
    Swap(c, d);
    cout << "c:" << c << ", d:" << d <<endl;

    string s("abc");
    string t("def");
    Swap(s, t);
    cout << s << endl;
    cout << t << endl;

    const int n = 3;
    int e[n] = {1,2,3};
    int f[n] = {4,5,6};

    cout << "before swap:" << endl;
    for(int i = 0; i < n; i++)
        cout << e[i] << " ";
    cout << endl;
    for(int i = 0; i < n; i++)
        cout << f[i] << " ";
    Swap(e, f, n);
    cout << endl;
    
    cout << "after swap:" << endl;
    for(int i = 0; i < n; i++)
        cout << e[i] << " ";
    cout << endl;
    for(int i = 0; i < n; i++)
        cout << f[i] << " ";
    
    return 0;
}

//template overloading definition
template <class T>
void Swap(T &a, T &b){
    T temp;
    temp = a;
    a = b;
    b = temp;
}

//template overloading definition
template <class T>
void Swap(T *a, T *b, int n){
    for(int i = 0; i < n; i++){
        T temp;
        temp = a[i];
        a[i] = b[i];
        b[i] = temp;
    }
}

输出如下:

显式实例化和显式具体化

显式实例化(explicit instantiation),显式具体化(explicit specialization)。

显式实例化对应的是隐式实例化,上面的列子Swap(a, b)就是利用Swap的模板生成一个int类型的实例,即隐式实例化。

显式实例化语法:template void Swap<double>(double &, double &);

显示具体化语法:

template <> void Swap(double &, double &); 或者template<> void Swap<double>(double &, double &);

并且声明了显式具体化还需要对其进行定义,有了显式具体化告诉编译器不要使用Swap的原始模板来生成一个参数类型为double型Swap实例。

C++ Primer Plus书中写到:

#include <iostream>
#include <string>

using namespace std;

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

template <typename T>
void Swap(T *a, T *b, int);

template <> void Swap<int>(int &, int &);   //explicit specialization,必须定义
template void Swap<double>(double &, double &);  //explicit instantiation


int main()
{
    double a = 3.4, b = 5.6;
    Swap(a, b);
    return 0;
}

//orginal template
template <class T>
void Swap(T &a, T &b){
    T temp;
    temp = a;
    a = b;
    b = temp;
}


//显示具体化 (explicit specialization)
template <> void Swap<int>(int &a, int &b){
    int temp;
    temp = a;
    a = b;
    b = temp;
}

标签:temp,int,double,void,C++,Swap,template,模板
From: https://www.cnblogs.com/qianxiaohan/p/18173463

相关文章

  • Qt/C++音视频开发72-倍速推流/音视频同步倍速推流/不改变帧率和采样率/低倍速和高倍速
    一、前言最近多了个新需求,需要倍速推流,推流界的扛把子obs也有倍速推流功能,最高支持到两倍速。这里所说的倍速,当然只限定在文件,只有文件才可能有倍速功能,因为也只有文件才能倍速解码播放。实时视频流是不可能倍速的,因为没有时长,有时长的才可以按照播放进度来。是否是文件也不能通......
  • C++ 抽象类快速使用
    在C++中,你可以通过在类定义中使用纯虚函数(purevirtualFunction)来创建一个抽象类。这里的“抽象”意味着这个类不能被实例化,即你不能创建这个类的对象。在C++中,你可以通过在类定义中使用纯虚函数(purevirtualFunction)来创建一个抽象类。这里的“抽象”意味着这个类不能被实例化......
  • C++ lambda的重载
    先说结论,lambda是不能重载的(至少到c++23依旧如此,以后会怎么样没人知道)。而且即使代码完全一样的两个lambda也会有完全不同的类型。但虽然不能直接实现lambda重载,我们有办法去模拟。在介绍怎么模拟之前,我们先看看c++里的functor是怎么重载的。首先类的函数调用运算符是可以重载......
  • C++-研讨会(全)
    C++研讨会(全)原文:annas-archive.org/md5/5ba4b421a6ba3d7c3a23406bab386ec0译者:飞龙协议:CCBY-NC-SA4.0前言关于本书C#是一种强大而多才多艺的面向对象编程(OOP)语言,可以打开各种职业道路。但是,与任何编程语言一样,学习C#可能是具有挑战性的。由于有各种不同的资源可用,很难......
  • C++-专家编程(全)
    C++专家编程(全)原文:annas-archive.org/md5/57ea316395e58ce0beb229274ec493fc译者:飞龙协议:CCBY-NC-SA4.0前言学习路径和技术简介。这个学习路径适合谁这个学习路径适合想要提升并学习如何在最新版本的Java中构建健壮应用程序的Java开发人员。这个学习路径涵盖了什......
  • C++-游戏动画编程实用指南(全)
    C++游戏动画编程实用指南(全)原文:annas-archive.org/md5/1ec3311f50b2e1eb4c8d2a6c29a60a6b译者:飞龙协议:CCBY-NC-SA4.0前言现代游戏动画有点像黑魔法。没有太多资源详细介绍如何构建基于轨道驱动的动画系统,或者高级主题,比如双四元数蒙皮。这本书的目标就是填补这个空白。......
  • 【转载】Godot-GDExtension C++ 环境搭建 (Docker+MinGW/跨平台)
    本文原链接见 Godot-GDExtensionC++环境搭建(Docker+MinGW/跨平台)|Convexwf'sKirakiraBlog。Godot在4.X之后推出了GDExtension,通过第三方绑定扩展功能,目前官方支持的语言只有C++。通过使用GDExtensionC++编写扩展插件,可以作为库文件在Godot中交互使用。GDExten......
  • 对拍模板
    对拍一共建立4个文件duipai.cpp#include<bits/stdc++.h>usingnamespacestd;intmain(){ intt=0; while(1){ cout<<"Test:"<<t++<<endl; system("data.exe>data.in"); system("std.exe<data.in&......
  • 括号转树的模板
    电子书板子:希冀平台:#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<sstream>#include<string>#include<string.h>#include<iomanip>#include<stdlib.h>#include<map&g......
  • UE4 C++ 杂
    TMap中的Find和FindRef在对蓝图节点进行C++重写时,发现UE对于TMap的Find有很多方式。首先是基础的Find,其就是返回对象类型的指针,如果不存在于TMap中其会返回nullptr接下来是FindChecked,其返回的是对象类型的引用,并且会在内部检测指针是否为空,如果没有会触发断言FindRef其......