模板类的特例化(具体化)

2023-11-10

模板的基础知识:

模板的实例化

        模板并不是真正的函数或类,它仅仅是编译器用来生成函数或类的一张“图纸”。模板不会占用内存,最终生成的函数或者类才会占用内存。由模板生成函数或类的过程叫做模板的实例化,相应地,针对某个类型生成的特定版本的函数或类叫做模板的一个实例。

        模板的实例化是按需进行的,用到哪个类型就生成针对哪个类型的函数或类,不会提前生成过多的代码。也就是说,编译器会根据传递给类型参数的实参(也可以是编译器自己推演出来的实参)来生成一个特定版本的函数或类,并且相同的类型只生成一次。实例化的过程也很简单,就是将所有的类型参数用实参代替。

模板的特例化(具体化)

        模板是一种泛型技术,它能接受的类型是宽泛的、没有限制的,并且对这些类型使用的算法都是一样的(函数体或类体一样)。让模板能够针对某种具体的类型使用不同的算法(函数体或类体不同),这在 C++ 中是可以做到的,这种技术称为模板的显示具体化

模板的特例化(具体化)

模板的实例化

#include <iostream>
using namespace std;

template<typename T>
class Test{
public:
    Test() {
        cout << "Test(T ma)" << endl;
    }
};

int main()
{
    Test<int> t1;
    Test<char*> t2;
    Test<int(*)(int,int)> t3;

    return 0;
}

/*输出
Test(T ma)
Test(T ma)
Test(T ma)
*/

模板的完全特例化

template<typename T>
class Test{
public:
    Test() {
        cout << "Test(T ma)" << endl;
    }
};
//模板的完全特例化
template<>
class Test<char*>{
public:
    Test() {
        cout << "class Test<char*>" << endl;
    }
};


int main()
{
    Test<int> t1;
    Test<char*> t2;
    Test<int(*)(int,int)> t3;

    return 0;
}
/*
Test(T ma)
class Test<char*>  调用模板char* 的完全特例化
Test(T ma)
*/

模板的部分特例化


template<typename T>
class Test{
public:
    Test() {
        cout << "Test(T ma)" << endl;
    }
};

//模板的部分特例化
template <typename Ty>
class Test<Ty*>{
public:
    Test() {
        cout << " class Test<Ty*>" << endl;
    }
};

//模板的部分特例化
template<typename Ty, typename A1, typename A2>
class Test<Ty(*)(A1, A2)>{
public:
    Test() {
        cout << "class Test<Ty(*)(A1, A2)" << endl;
    }
};

int main()
{
    Test<int> t1;
    Test<char*> t2;
    Test<int(*)(int,int)> t3;

    return 0;
}
/*
Test(T ma)
 class Test<Ty*>
class Test<Ty(*)(A1, A2)
*/

 模板的优先级

template<typename T>
class Test{
public:
    Test() {
        cout << "Test(T ma)" << endl;
    }
};
//完全特例化
template<>
class Test<char*>{
public:
    Test() {
        cout << "class Test<char*>" << endl;
    }
};

//部分特例化
template <typename Ty>
class Test<Ty*>{
public:
    Test() {
        cout << " class Test<Ty*>" << endl;
    }
};

//部分特例化
template<typename Ty, typename A1, typename A2>
class Test<Ty(*)(A1, A2)>{
public:
    Test() {
        cout << "class Test<Ty(*)(A1, A2)" << endl;
    }
};

int main()
{
    Test<int> t1;
    Test<char*> t2;
    Test<int(*)(int,int)> t3;

    return 0;
}
/*
Test(T ma)
class Test<char*>
class Test<Ty(*)(A1, A2)
*/

从上面的结果可以看出来,模板的完全特例化   高于部分特例化    高于模板。

        在模板的部分特例化中,不能狭隘的认为只有模板参数列表是原来模板参数列表个数的子集,才算是部分特例化,应当把模板列表中 typename T,这个T当作一个大的类型,T <- Ty*,这样也是可以的。

function 的实现


template<typename T>
class Myfunction{};

template<typename R, typename ...A>
class Myfunction<R(A...)> {
public:
    using pfunc = R(*)(A...);
    Myfunction(pfunc func) : pfunc_(func)
    {}
    R operator()(A... arg){
        return pfunc_(arg...);
    }
private:
    pfunc pfunc_;
};

void print(string str) {
    cout << str << endl;
}

int main()
{
    Myfunction<void(string)> func1 = print;
    func1("hello world");

    return 0;
}

注意在特例化模板之前,需要有一个模板。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模板类的特例化(具体化) 的相关文章

  • 为什么使用abs()或fabs()而不是条件否定?

    在 C C 中 为什么要使用abs or fabs 不使用以下代码即可查找变量的绝对值 int absoluteValue value lt 0 value value 这与较低级别的指令较少有关吗 您提出的 有条件的abs 并不等于std
  • Mono 无法保存用户设置

    我在 Mono Ubuntu 上保存用户设置时遇到问题 这是代码示例 private void Form1 Load object sender EventArgs e string savedText Properties Setting
  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • 单元测试失败,异常代码为 c0000005

    我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试 这是我的测试 TEST METHOD CalculationsRoundTests int result Calculations Round 1 0
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • 运行代码首先迁移更新数据库时出错

    我在迁移到数据库时遇到问题 并且似乎找不到我遇到的错误的答案 System MissingMethodException Method not found System Data Entity Migrations Builders Tab
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

    我是 WPF 和 DPI 感知 API 的新手 正在编写一个在 Windows 7 8 1 和 10 中运行的应用程序 我使用具有不同每个显示器 DPI 设置的多个显示器 并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容 我已经知道可以将

随机推荐

  • M - Marbles Lucky Distribution(贪心)

    M Marbles Lucky Distributionhttps vjudge csgrandeur cn problem Gym 101845M Juan have N red marbles M blue marbles and K
  • 用定时器设计门铃,按下按键时蜂鸣器发出叮咚的门铃声

    叮咚 产生的方式 仿真 程序代码 include
  • 作为一个江苏人,我眼中的苏宁

    江苏人 人人都在苏宁电器的地面商店里买过东西 我也不例外 听说张近东要转让苏宁易购的股份给一家疑似国企或国有基金 作为一个地道的江苏人 感慨良多 中国有4个电商平台 天猫 京东 拼多多和苏宁易购 还有大商 国美什么 已经彻底掉队 暂且不提
  • 推荐你个软件 TDengine

    推荐你个软件 https github com taosdata TDengine 时序数据库 效率非常高 https constd com 2019 07 26 tdengine doc https www taosdata com cn
  • Linux 桌面虚拟化技术 KVM

    KVM 是 Kernel based Virtual Machine 的简称 是一个开源的系统虚拟化模块 自Linux 2 6 20之后集成在Linux的各个主要发行版本中 它使用Linux自身的调度器进行管理 所以相对于Xen 其核心源码
  • Easylogging介绍和简单使用

    一 Easylogging简介 Easyloggingpp是一个C 开源log库 其在github的地址 https github com muflihun easyloggingpp Easyloggingpp最大的特点是只需一个头文件
  • 最全面计算机英语单词列表(四)

    作为一名开发者 不管是自己写代码还是阅读英文文档 英语水平对于开发进度有很大的影响 业余时间简单整理了计算机开发中常见的英语单词 不限于前端开发 再此和朋友们分享 单词较多 为了阅读体验良好分成几个部分 下面是其他部分的链接 最全面计算机英
  • go get 与git clone的区别

    一直对go get 和git clone 区别不开 go get 的参数说明 d 只下载不安装 f 只有在你包含了 u参数的时候才有效 不让 u去验证import中的每一个都已经获取了 这对于本地fork的包特别有用 fix 在获取源码之后
  • 布局优化之ViewStub原理

    1 概述 在进行Android程序开发时 除了要实现基本功能外 还要关注应用的性能 内存占用少 程序稳定 响应速度快等 懒加载 就是为了让程序尽可能快地启动而提出的一个优化策略 即让那些对用户不重要或者不需要立即显示的布局控件做延迟加载 只
  • Linux下进程与多线程之间的共享资源

    在Linux 下 程序或可执行文件是一个静态的实体 它只是一组指令的集合 没有执行的含义 进程是一个动态的实体 有自己的生命周期 线程是操作系统进城调度器可以执行的最小执行单元 同一个进程中的各个线程都有自己独立的线程ID 用来标识线程 如
  • 使用jsPlumb制作流程图设计器

    jsPlumb是一个比较强大的绘图组件 它提供了一种方法 主要用于连接网页上的元素 在现代浏览器中 它使用SVG或者Canvas技术 而对于IE8以下 含IE8 的古董浏览器 则使用VML技术 项目主页 http jsplumbtoolki
  • PCL 常用小知识

    目录 零 保存点云 一 时间计算 二 已知需要保存点的索引 从原点云中拷贝点到新点云 三 删除无效点 四 pcl PointCloud Ptr和pcl PointCloud的两个类相互转换 五 计算点云中心点 六 将vector型索引转换成
  • scikit-learn 逻辑回归--调参

    代码笔记 from sklearn linear model import LogisticRegression as LR from sklearn datasets import load breast cancer import nu
  • CTFshow web15

    ctf show 萌新模块 web15关 这一关是代码执行漏洞 需要灵活的运用PHP的命令执行函数 在上一关的基础上又过滤了 gt 关键字 看起来已经没啥思路了 但仔细一看 它居然取消了对分号 的过滤 这样一来就好办了 继续上一关的曲线救国
  • IDEA中打jar包的方式

    在讲这两种方式之前 我们先来说明一下什么是java中的jar文件 jar Java Archive File 翻译过来就是java的档案文件 它其实也类似于我们windows下的zip文件 唯一的区别就是在 JAR 文件的内容中 包含了一个
  • opencv学习--图像处理基础

    将图片处理为灰度图 import os import re import cv2 from PIL import Image import numpy as np import matplotlib pylab as pylab img c
  • css公共样式总结(持续总结)

    flex display flex align center align items center justify between justify content space between justify center justify c
  • java基础(一)-虚拟机和第一个命令

    虚拟机 用 Java 语言编写的程序由 Java 虚拟机 JVM 来执行 JVM 是一个特殊的程序 它知道如何执行用 Java 语言编写的程序 并且它的命令列表涵盖范围很大 比如 System out println 你以为我会说虚拟机是由
  • WebGL简介

    WebGL简介 前言 1 WebGL简介 1 1 WebGL概述 1 2 WebGL程序的结构 1 3 WebGL和OpenGL 2 着色器语言 2 1 顶点着色器 2 2 片元着色器 3 webGL绘制一个点 4 webGL渲染过程 前言
  • 模板类的特例化(具体化)

    模板的基础知识 模板的实例化 模板并不是真正的函数或类 它仅仅是编译器用来生成函数或类的一张 图纸 模板不会占用内存 最终生成的函数或者类才会占用内存 由模板生成函数或类的过程叫做模板的实例化 相应地 针对某个类型生成的特定版本的函数或类叫