我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C语言的模板与泛型编程是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C语言的模板与泛型编程是什么

本篇内容主要讲解“C语言的模板与泛型编程是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言的模板与泛型编程是什么”吧!

    模板与泛型编程浅谈

    摘要(Effective C++):

    C++template的最初发展动机很直接:让我们得以建立“类型安全”的容器如vector,list和map。然而当愈多人用上templates时,他们发现template有能力完成愈多可能的变化。容器当然很好,但泛型编程(generic programming)——写出的代码和其所处理的对象类型彼此独立——更好。STL算法如for_each,find和merge就是这一类编程的结果。最终人们发现,C++template机制自身是一部完整的图灵机:它可以用来计算任何可计算的值。于是导出了模板元编程(template mataprogramming),创造出“在C++编译器内执行并于编译完成时停止执行”的程序。

    模板与泛型编程简单介绍

    面向对象编程(OOP)和泛型编程都可以处理编写程序时不知道类型的情况;二者的不同之处在于:OOP能处理类型在程序运行之前都未知的情况;而在泛型编程中,在编译时就能获知类型了

    我们所常用的STL标准库中,每一个容器都提供了单一的,泛型的定义,例如我们所常用的vector,我们可以定义很多类型的vector

    vector<int> vi; // vi是装载int类型的vector容器的实例vector<string> vs; // vs是装载string类型的vector容器的实例vector<double> vd; // vd是装载double类型的vector容器的实例

    模板是泛型编程的基础,一个模板就是一个创建类或者函数的蓝图或者公式

    函数模板

    // 简单的比较函数模板template<typename T>int cmp(const T& v1,const T& v2) {    if(v1<v2)        return -1;    else if(v1>v2)        return 1;    else        return 0;}

    函数定义以关键字template开始,后跟一个模板参数列表,这是一个逗号分隔的一个或多个模板参数的列表,用尖括号包围起来

    **注:**在模板定义中,模板参数列表不能为空

    模板参数列表表示在类或函数定义中用到的类型或者值。当我们使用模板的时候,我们可以(显式或隐式地)指定模板实参,将其绑定到模板参数上

    简单了解模板的实例化过程

    众所周知,当你觉得模板编程十分智能的时候,一定是有东西在为你负重前行,C++提供了模板与泛型编程的这个能力,这便意味着有一个东西在为你动态地实现模板的功能,而这一定是比C++这个高级语言层面更为底层的东西,而我们所了解的知识中,比C++高级语言较为底层的东西,除了操作系统,便是编译器了。

    当我们调用一个函数模板的时候,编译器(通常)用函数实参来为我们推断模板实参。简单来讲,便是我们在调用函数模板的时候,编译器通过使用实参的类型来确定绑定到模板参数T的类型

    cout<<cmp(1,0)<<endl; // T为int

    在上诉代码中,函数cmp的实参类型是int,编译器便会推断出模板实参为int,并将它绑定到模板参数T上

    简单来说,编译器用推断出的模板参数来为我们实例化一个特定版本的函数

    模板编译

    当编译器遇到一个模板定义的时候,它并不会生成代码。只有我们实例化出模板的一个特定的版本时,编译器才会生成其对应的代码。当我们使用(而不是定义)模板时,编译器才会生成代码。这个特性影响我们如何组织代码以及错误何时才可以被检测到

    通常来说,我们将类定义和函数说明放在头文件中,而普通函数和类的成员函数的定义放在源文件中

    模板则不尽相同:为了生成一个实例化的版本,编译器需要掌握函数模板或类模板成员函数的定义

    总结与非模板代码不同,模板的头文件通常既包括声明也包括定义即函数模板和类模板成员函数的定义通常放在头文件中

    大多数编译错误出现的时机 

    • 第一阶段,编译模板本身时,该时期所出现的错误大多数为语法错误

    • 第二阶段,编译器遇到模板使用时

    • 第三阶段,模板实例化时,而只有在这个阶段才能发现类型相关的问题

    **注意事项:**保证传递给模板的实参支持模板所要求的操作,以及这些操作在模板中能正确的工作,是调用者的责任

    类模板

     类模板是用来生成类的蓝图的。与函数模板不同之处是,编译器不能为类模板推断模板参数类型。 所以我们必须在模板名后的尖括号中提供额外的信息&mdash;&mdash;用来替代模板参数的模板实参列表

    vector<int> vi;deque<double> dd;pair<string,int> key_val;

    定义类模板

    template<typename T>class T_vector {public:typedef T value_type;    // 构造函数    T_vector() =default;    T_vectot(std::initializer_list<T> il);    // 容器的元素数目    size_type size() const { return data->size(); }    bool empty() const { return data->empty(); }    // 添加元素    void push_back(const T& val) {         data->push_back(val);    }    void push_back(T &&val) {        data->push_back(std::move(val));    }private:    std::shared_ptr<std::vector<T> > data;    // 若data[i]无效,则抛出msg    void check(size_type i,const std::string &msg) const;}

    类似函数模板,类模板以关键字template开始,后跟模板参数列表。在类模板(及其成员)的定义中,我们将模板参数当作替身,代替使用模板时用户需要提供的类型或值

    **注:**一个类模板的每一个实例都形成一个独立的类,而类模板的每个实例都有其自己版本的成员函数

    所以,我们可能会出现一个单一模板并不能满足所有类型的需求,而模板特例化就出现了

    类模板成员函数的实例化

    默认的情况下,一个类模板的成员函数只有在程序用到它的时候才会实例化

    // 实例化T_vector和接受initializer_list<int>的构造函数T_vector<int> T_vi = { 0,1,2,3,4,5 };

    如果一个成员函数没有被使用,则它将不会被实例化

    为什么我们需要模板特例化?

    当我们编写单一的模板时,使其对任何可能的模板实参都是最合适的,都能实例化,但者往往都是过于理想化的情况。在某些特殊的情况下,通用的模板的定义可能对特定的类型是不合适的,通用定义的模板可能会出现编译失败或者做得不够完善的情况。

     故,当我们不能(或者不希望)使用模板版本的时候,可以定义类或函数模板的一个特例化版本

    定义函数模板特例化

    // 原先cmp函数的特殊版本,用来处理特殊的字符数组的指针template<>int cmp(const char* const& p1,const char* const& p2) {    return strcmp(p1,p2);}// 原先cmp函数的特殊版本,用来处理特殊的字符数组的指针template<>int cmp(const char* const& p1,const char* const& p2) {    return strcmp(p1,p2);}

    函数重载与模板特例化的区别

    当定义函数模板的特例化版本时,我们本质上接管了编译器的工作。即,我们为原先的模板的其中一个特殊的实例提供了定义。简而言之,特例化的本质是实例化一个模板,而非重载它,因此特例化并不影响函数匹配

    注意事项:

    • 为了特例化一个模板,原模版的声明必须在作用域中

    • 在任何使用模板实例的代码之前,特例化版本的声明也必须在作用域中

    • 所有同名模板的声明应该放在前面,然后是这些模板的特例化版本

    类模板部分特例化

    与函数模板不同的是,类模板的特例化不必为所有模板参数提供实参。一个类模板的部分特例化本身是一个模板,使用它时用户还必须为那些在特例化版本中指定的模板参数提供实参

    我们只能部分特例化类模板,而不能部分特例化函数模板

    到此,相信大家对“C语言的模板与泛型编程是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    C语言的模板与泛型编程是什么

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    C语言的模板与泛型编程是什么

    本篇内容主要讲解“C语言的模板与泛型编程是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言的模板与泛型编程是什么”吧!模板与泛型编程浅谈摘要(Effective C++):C++temp
    2023-06-29

    泛型编程和模板元编程之间的关系是什么?

    泛型编程和模板元编程在现代 c++++ 中是两个强有力的技术,分别用于在运行时处理不同类型的数据(泛型编程)和在编译时创建和计算代码(模板元编程)。尽管它们都基于模板,但它们在功能和使用上却有很大不同。在实践中,这两种技术经常一起使用,例如
    泛型编程和模板元编程之间的关系是什么?
    2024-04-25

    模板库和泛型库在 C++ 泛型编程中的作用?

    模板库和泛型库通过允许数据类型参数化和提供预定义的模板来实现泛型编程,提高了代码的可复用性和灵活性,包括:模板库:提供模板声明机制,创建根据数据类型参数化的类型或函数,例如 std::vector 模板容器。泛型库:提供预定义的模板函数和类
    模板库和泛型库在 C++ 泛型编程中的作用?
    2024-04-24

    泛型和元编程的模型是什么

    这篇文章主要介绍“泛型和元编程的模型是什么”,在日常操作中,相信很多人在泛型和元编程的模型是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”泛型和元编程的模型是什么”的疑惑有所帮助!接下来,请跟着小编一起来
    2023-06-15

    C++ 函数异常与模板编程:泛型错误处理

    用异常处理和模板编程实现泛型错误处理。 1. 异常处理:使用 try-catch-throw 机制,在函数中抛出异常。 2. 模板编程:创建可用于任何类型的泛型代码,包括可处理任何类型错误的泛型错误处理程序。 3. 泛型错误处理:使用模板函
    C++ 函数异常与模板编程:泛型错误处理
    2024-05-03

    C语言中怎么实现泛型编程

    这篇文章给大家介绍C语言中怎么实现泛型编程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。泛型编程(generic programming)是程序设计语言的一种风格或范式。泛型允许程序员在强类型程序设计语言中编写代码时
    2023-06-15

    泛型类与函数模板的区别是什么?

    泛型类定义新数据类型,而函数模板定义算法。泛型类通过指定类型参数实例化,函数模板通过调用实例化。泛型类可以继承,而函数模板不能。泛型类与函数模板的区别泛型类和函数模板都是 C++ 中用于创建可重用代码的有力工具。它们允许我们创建适用于多种
    泛型类与函数模板的区别是什么?
    2024-04-24

    c语言是什么编程语言

    c语言作为一种通用、结构化的编程语言,自诞生以来广泛应用于计算机领域。其基本特性包括结构化编程、过程式编程、底层访问能力、高效性能和跨平台性。在编程语言中,c语言是系统级编程的基石,也是许多高级语言的基础。它在嵌入式系统开发、操作系统开发、
    c语言是什么编程语言
    2024-03-14

    c#是一种什么类型的编程语言

    c# 是一种面向对象的编程语言,由微软开发并广泛用于构建 windows 应用程序、游戏和其他软件。其特点包括面向对象、类型安全、垃圾收集,以及与 .net 框架的紧密集成。c# 可跨平台使用,应用范围广泛,包括 windows 应用程序、
    c#是一种什么类型的编程语言
    2024-04-04

    C++ 函数模板详解:迎接泛型编程的未来

    函数模板在 c++++ 中允许创建泛型函数,用于处理各种数据类型。它们定义了一个函数族,其中类型作为参数提供。语法:template returntype functionname(parameterlist);使用时通过提供特定类型来实例
    C++ 函数模板详解:迎接泛型编程的未来
    2024-04-28

    go语言中泛型是的是什么

    今天小编给大家分享的是go语言中泛型是的是什么,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。在go语言中,泛型就是编写模板适应所有类型,只有在具体使用时才定义具体变量类型;通过引入类
    2023-07-04

    C++ 函数模板详解:泛型编程的本质解析

    函数模板是 c++++ 中的泛型编程特性,允许创建通用的函数以处理不同类型参数,提高代码灵活性、可重用性和简洁性:定义:函数模板提供函数签名,使用类型参数指定函数操作的数据类型。使用:通过指定类型参数调用函数模板,可用适用于任何类型的通用函
    C++ 函数模板详解:泛型编程的本质解析
    2024-04-26

    C++ 成员函数详解:对象方法的泛型编程与模板化

    c++++ 成员函数是类内部定义的函数,可访问类的数据成员和变量。泛型编程和模板化使代码可重用且独立于数据类型。泛型编程允许编写可用于不同数据类型的代码,而模板化允许创建可用于不同类型成员函数的类。对于需要计算不同形状面积的程序,可使用模板
    C++ 成员函数详解:对象方法的泛型编程与模板化
    2024-04-29

    C++ 模板函数的声明语法:深入剖析泛型编程的规则

    模板函数的声明语法:template returntype functionname(parameters),表示函数操作的数据类型 t,以及函数的返回类型、名称和参数。C++ 模板函数的声明语法:泛型编程的规则**概述模板函数是 C+
    C++ 模板函数的声明语法:深入剖析泛型编程的规则
    2024-05-04

    C++ 泛型编程的优势和局限性是什么?

    泛型编程是一种c++++技术,具有如下优势:提高代码重用性,可处理多种数据类型。代码更简洁易读。在某些情况下可提高效率。但它也存在局限性:编译时需要更多时间。编译后代码会更大。可能产生运行时开销。C++ 泛型编程:优势与局限性优势代码重用
    C++ 泛型编程的优势和局限性是什么?
    2024-04-24

    python是什么类型的编程语言

    Python是一种面向对象的动态、强类型的编程语言,是一门有条理的和强大的面向对象的程序设计语言。Python简单易用,学习成本低,看起来非常优雅干净;Python标准库和第三库众多,功能强大,既可以开发小工具,也可以开发企业级应用。
    2023-05-14

    c语言是什么语言类型的

    c语言是一种用于开发各种软件的高级编程语言。它采用流程式范式,使用控制流语句来控制程序流程。它是一种结构化语言,使用块和函数组织代码,并遵循自顶向下的设计方法。c语言是一种编译语言,需要编译为机器代码才能执行。此外,它是一种面向过程语言,专
    c语言是什么语言类型的
    2024-04-13

    c语言编程是什么专业

    c语言编程是计算机科学与技术专业的核心课程,旨在培养具备计算机系统、软件开发和网络方面的知识和技能的高级技术人才。c语言的特点包括通用性强、效率高、可移植性好和低级性,在计算机科学与技术专业中,c语言编程是学习计算机系统基础、数据结构、算法
    c语言编程是什么专业
    2024-04-13

    c语言编程软件是什么

    c 语言编程软件是用于编写、调试和编译 c 语言程序的软件,它提供友好的界面,集成了代码编辑器、调试器、编译器和 ide 等功能,常見的 c 語言編程軟件包括 microsoft visual studio code、xcode、eclip
    c语言编程软件是什么
    2024-04-13

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录