首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C++】泛型编程 ③ ( 函数模板 与 普通函数 调用规则 | 类型匹配 | 显式指定函数模板泛型类型 )

一、普通函数 与 函数模板 的调用规则 - 类型匹配 1、类型匹配 上一篇博客 【C++】泛型编程 ② ( 函数模板与普通函数区别 ) 中 , 分析了 函数参数 类型匹配 下的 普通函数 与 函数模板...的调用规则 ; 为 函数模板 重载了 普通函数 , 普通函数有指定的类型 ; // 使用 template 关键字 声明函数模板 // 告诉 C++ 编译器 开始使用 泛型编程 // 定义的 T 是泛型类型...namespace std; // 使用 template 关键字 声明函数模板 // 告诉 C++ 编译器 开始使用 泛型编程 // 定义的 T 是泛型类型 // 声明了多个泛型, 可以只使用其中的部分类型...如果 符合 普通函数类型参数要求 , 优先调用普通函数 ; // 如果 没有 符合要求的 普通函数 , 则查看 模板函数 能否匹配 ; // 如果 模板函数 仍不能匹配 , 则查看 普通函数 类型转换能否匹配...template 关键字 声明函数模板 // 告诉 C++ 编译器 开始使用 泛型编程 // 定义的 T 是泛型类型 // 声明了多个泛型, 可以只使用其中的部分类型 // 使用函数模板时 ,

20340

在C++中反射调用.NET(三) 使用非泛型集合的委托方法C++中的列表对象list C++传递集合数据给.NET创建泛型List实例反射静态方法反射调用索引器当委托遇到协变和逆变C++CLI

使用非泛型集合的委托方法 先看看.NET类中的一个返回列表数据的方法: //返回List或者数组,不影响 C++调用 public List GetUsers(string...using namespace System::Collections::Generic; 因为在C++端,没有直接引用用户项目的.NET程序集,并不知道泛型集合类型的具体类型,IUserInfo这个接口无法直接访问...在C++端看来,SaveUsers方法的参数对象是一个泛型集合,但是具体是什么对象并不知道,所以需要反射出泛型集合的类型,同时还需要构建这样一个泛型集合对象实例。...一切准备就绪,下面可以通过以下步骤提交集合数据给.NET方法了: 1,反射.NET方法,获取参数的泛型形参类型; 2,创建此泛型形参的泛型List对象实例; 3,遍历C++集合(列表list),将结构数据赋值给动态创建的实体类对象...综合对比,C++/CLI中反射调用.NET,比起在.NET平台内部反射调用,性能没有很大的差距,所以C++/CLI中反射调用.NET是一个可行的方案。

9.1K100
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    浅谈 C++ 元编程

    类模板 和 函数模板 分别用于定义具有相似功能的 类 和 函数 (function),是泛型中对 类型 和 算法 的抽象。...1.4.2 泛型 lambda 表达式 由于 C++ 不允许在函数内定义模板,有时候为了实现函数内的局部特殊功能,需要在函数外专门定义一个模板。...在 C++ 17 之前,编译时测试是通过模板的 实例化 和 特化 实现的 —— 每次找到最特殊的模板进行匹配;而 C++ 17 提出了使用 constexpr-if 的编译时测试方法。...函数 Sum 有两个重载:一个是对没有函数参数的情况,一个是对函数参数个数至少为 1 的情况。和定长模板的迭代类似,这里也是通过 递归 调用实现参数遍历。...为了减少可能产生的错误,Bjarne Stroustrup 等人提出了在 语言层面 上,给模板上引入 概念 (concept)。

    3.1K61

    C++20新特性简介-Concepts

    本文根据作者个人理解介绍C++20标准中引入的新概念:Concept 强大的泛型编程 基本上从C++语言出现开始,泛型编程就是C++的重要组成部分之一。...C++标准库中的容器,算法等功能库中,大量使用的泛型编程。 困难的泛型编程 如果只是使用C++标准库中的容器、算法的话,一般不会遇到太大的问题。...由于这个模板函数已经可以用于整数和双精度数,错误的原因不在模板函数本身,而是在调用模板时使用实际数据Complex。但问题是错误信息并没有提示是哪个调用出的问题。...另外,错误信息显示没有匹配的+操作符,这是真正的原因。但是接下来Complex没有从各种类继承等附注信息就只有添乱了。作者相信只要使用过泛型编程的程序员都会有过类似的经历。...引入的Concept之后,同样的问题,显示的错误信息完全不同: 出错的位置从模板函数内部变成了调用模板函数的代码(58行)。软件规模变大之后,快速定位引发问题的位置特别重要。

    1.3K10

    探索C嘎嘎:模版初阶

    正文: 1.泛型编程 1.1.引子 在讲述泛型编程之前,小编先说一个例子来帮助各位读者朋友等会更好的去了解泛型编程,交换函数想必各位读者朋友都非常清楚,我们在C语言阶段就多次写过交换函数,小编也在二叉树那篇文章也写过交换函数...于是C++就推出了一个好用的功能,它就是模版,通过写模版我们就可以实现出交换函数,一个模版便可以解决上面三个函数的问题2,在具体讲解模版之前,小编先给各地读者朋友简单介绍一下泛型编程。...泛型编程就是编写与类型无关的通用代码,是代码复用的一种手段,我们今日所讲的模版,便就是泛型编程的基础,现在我们还不能完全去了解泛型编程,因为我们学的还没有那么深,现在我们仅需知道模版是泛型编程的基础即可...int类型,编译器会在传参的过程中默默会生成隐式类型转换,把其中不是整形的转换为整形的,这就是显示类型实例化,难度也没有很大,各位读者朋友要知道这些实例化的方法,避免以后框框出错,下面我们进入函数模版最后一部分的讲解...,这就引出了第二个特点: 2.对于非模版函数和同名函数模版,如果其他条件都相同,在调用时会优先调用非模版函数而不会从该模版产生出一个实例,如果模版可以产生一个具有更好匹配的函数,那么还是会选择模版。

    9410

    【C++篇】走进C++初阶模版:感受模版奇妙

    分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对C++感兴趣的朋友,让我们一起进步! 介绍 C++模板是泛型编程的核心,它允许程序员编写与数据类型无关的代码。...初始模板与函数模版 1.1 什么是泛型编程? 泛型编程(Generic Programming)是C++中的一种编程范式,旨在编写与数据类型无关的通用代码。...这意味着你可以编写一次代码,并通过不同的数据类型进行复用。C++通过模板(Template)来实现泛型编程,模板是泛型编程的核心工具。...模板的匹配原则 3.1 优先调用非模板函数 如果存在一个与实参完全匹配的非模板函数,编译器将优先调用非模板函数,而不是通过模板生成一个实例。...} 3.2 如果非模板函数没有匹配,则调用模板实例 如果模板函数比非模板函数更能匹配参数类型,编译器将生成模板实例。

    6610

    【C++】泛型编程 ② ( 函数模板与普通函数区别 )

    声明泛型 , 后面跟着 返回类型 , 函数名 , 参数列表 , 函数体 , 等内容 , 在 函数的 参数列表 返回类型 中可使用 声明的 泛型类型 , 如 : T add(T..., 所以 如果使用函数模板处理很多类型 , 需要创建很多普通函数实例 , 会导致编译时间增加 , 代码库增大 ; 维护难度高 : 如果错误地使用 函数模板 可能会导致难以查找的错误 , 普通函数 更简单..."iostream" using namespace std; // 使用 template 关键字 声明函数模板 // 告诉 C++ 编译器 开始使用 泛型编程 // 定义的 T 是泛型类型...// 声明了多个泛型, 可以只使用其中的部分类型 // 使用函数模板时 , 显式类型调用 必须 显式指定所有 泛型类型 的实际类型 template T add(T a,..., 不会进行 类型转换 ; // // 如果 符合 普通函数类型参数要求 , 优先调用普通函数 ; // 如果 没有 符合要求的 普通函数 , 则查看 模板函数 能否匹配 ; // 如果 模板函数

    24350

    【C++篇】引领C++模板初体验:泛型编程的力量与妙用

    本篇文章将包含以下几个部分: 泛型编程的基本概念 函数模板的定义与使用 类模板的实现 模板的匹配原则 通过阅读本文,你将能够掌握C++模板编程的基础知识,理解其背后的工作原理,并学会如何在实际项目中应用这些技术...第一章: 初始模板与函数模版 1.1 什么是泛型编程? 泛型编程(Generic Programming)是C++中的一种编程范式,旨在编写与数据类型无关的通用代码。...第三章: 模板的匹配原则 3.1 模板的匹配原则 C++编译器在调用模板时,会根据实参类型和函数参数类型进行匹配。...} 如果非模板函数没有匹配,则调用模板实例:如果模板函数比非模板函数更能匹配参数类型,编译器将生成模板实例。...,涵盖了泛型编程、函数模板、类模板、模板匹配原则等概念。

    23410

    C++基本语法

    #endif 以上代码代表如果没有定义过eetal这个宏变量,则会执行#ifndef和最近的endif之间的代码 类型别名 与宏定义类似的,c++还提供了typedef可以对类型取别名和定义一些函数指针的别名...上述代码等价于 using iint = int; using functionPointer = void (*)(int a); 泛型 c++的泛型通过template来设定,泛型方法代表该方法尚未注册实际代码...,只有在代码里调用了该方法时,会通过隐式触发或者显示定义或者主动触发来创建对应的方法实例 方法的匹配规则为 代码中指定泛型方法>普通方法>显示声明>泛型方法 如 //在一些标准好像typename...,匹配规则(代码中指定泛型方法>普通方法>显示声明>泛型方法) template void swap01(int &a,int &b); 此时调用如 int a,b; swap01(a,b...); //普通调用,先匹配显示声明 double c,d; swap01(c,d); //显示声明不匹配类型,触发隐式生成double泛型的方法实例匹配 char e,f; swap01

    1K20

    【C++】 ——【模板初阶】——基础详解

    在C++中,模板是一种强大的特性,可以实现代码的泛型编程,从而减少代码的重复,提高代码的复用性和可维护性。本文将详细讲解C++模板,涵盖以下几部分内容: 泛型编程 函数模板 类模板 1....在C++中,模板是实现泛型编程的核心机制。 1.2 泛型编程的历史与发展 泛型编程的概念最早由Alexander Stepanov和David Musser在1980年代提出。...1990年代,泛型编程在C++标准模板库(STL)的实现中得到了广泛应用。STL提供了一组基于模板的容器、算法和迭代器,这些组件极大地提高了C++程序的效率和灵活性。...当调用函数模板时,编译器会尝试匹配模板参数和函数参数类型。如果匹配成功,则进行实例化;否则,编译会失败。匹配原则包括: 类型推断:编译器根据传递的实际参数类型推断模板参数类型。...结论 通过函数模板和类模板,C++提供了强大的泛型编程能力,使得代码可以更加通用和复用。在实际编程中,合理地使用模板可以显著提高代码的质量和维护性。

    17510

    C++打怪升级(八)- 泛型编程初见

    本节将介绍泛型编程中模板的用法。...: 需要根据参数类型来手动增加接受该类型的函数,这对于我们来说很麻烦; 这一组函数代码的可维护性差,要改就需要更改一组函数,也很麻烦; 基于类似这样的原因,C++提出了泛型编程的概念,我们只需要写出一个函数模板而不是具体的函数...,我们直接使用这个函数模板,具体的函数由编译器自动生成; ---- 泛型编程是啥 编写与类型无关的通用代码,是代码复用的方法之一。...模板是泛型编程中的基本组成部分,分为函数模板和类模板。...这牵扯到了多个源文件的编译链接过程 链接错误,说明不是语法问题,而是链接时,test.o在class.o中找不到要调用的类模板实例化出来的函数,即类模板没有实例化处具体的函数,class.o符号表中也就没有相应函数的地址

    81620

    【C++】模板进阶

    模板参数分为类型模板参数和非类型模板参数,类型模板参数一般是class或typename定义出来的泛型,而非类型模板参数一般是整型定义出来的常量,这个常量作为类模板或函数模板的一个参数,在类模板或函数模板中可将该参数当成常量来使用...下面的main函数用于验证编译器对于模板的优先匹配机制,编译器总是会优先调用现成的模板,实在没有的时候,编译器才会自己推演实例化。...模板最大的优点就是可以进行泛型编程,并且能够进行代码的复用,提升了代码的可维护性,这也为STL(标准模板库)的产生奠定了基础。...能够泛型编程并且退出STL库才是C++真正拉开与C语言之间的距离的标志。 2. 但代码复用也会带来缺点,模板在实例化时,如果实例化出多个类,则会导致代码膨胀,增加编译器编译的时间。...由于模板的泛型性质,在报模板错误时,错误信息会非常的凌乱,不容易定位错误的具体位置,但大家在遇到模板大量的报错信息时,不要慌张,先去看报错的第一条信息,解决第一条错误信息后,后面的许多错误可能也会被解决掉了

    1.1K20

    【C++】泛型编程 ④ ( 函数模板 与 普通函数 调用规则 | 类型自动转换 | 类型自动转换 + 显式指定泛型类型 )

    ; // 使用 template 关键字 声明函数模板 // 告诉 C++ 编译器 开始使用 泛型编程 // 定义的 T 是泛型类型 // 声明了多个泛型, 可以只使用其中的部分类型 // 使用函数模板时...std; // 使用 template 关键字 声明函数模板 // 告诉 C++ 编译器 开始使用 泛型编程 // 定义的 T 是泛型类型 // 声明了多个泛型, 可以只使用其中的部分类型 /...普通函数类型参数要求 , 优先调用普通函数 ; // 如果 没有 符合要求的 普通函数 , 则查看 模板函数 能否匹配 ; // 如果 模板函数 仍不能匹配 , 则查看 普通函数 类型转换能否匹配...泛型编程 // 定义的 T 是泛型类型 // 声明了多个泛型, 可以只使用其中的部分类型 // 使用函数模板时 , 显式类型调用 必须 显式指定所有 泛型类型 的实际类型 template 匹配 , 不会进行 类型转换 ; // // 如果 符合 普通函数类型参数要求 , 优先调用普通函数 ; // 如果 没有 符合要求的 普通函数 , 则查看 模板函数 能否匹配

    29150

    C++从入门到精通——模板

    前言 C++模板是C++语言中的一种泛型编程技术,可以实现在编译期间生成不同类型的函数或类。通过使用模板,可以编写通用的代码,使其能够处理多种不同类型的数据。...C++模板可以分为函数模板和类模板两种类型 一、泛型编程 如何实现一个通用的交换函数呢?...泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。...模板参数可以在函数模板定义中的任何地方使用。 函数模板的实例化是通过在调用函数时根据实际参数类型来自动生成具体的函数。编译器根据调用的参数类型匹配合适的函数模板实例化,并生成对应的函数代码。...总结 都有的情况,优先匹配普通函数+参数匹配 没有普通函数,优先匹配参数匹配+函数模板 只有一个,类型转换一下也能用,也可以匹配调用 template T1 Add

    10810

    C++模版的本质

    ); 函数模板实例化过程中,参数推导不匹配所有的模板或者同时存在多个模板实例满足,或者函数重载决议有歧义等,实例化失败; 为了编译函数模板调用,编译器必须在非模板重载、模板重载和模板重载的特化间决定一个无歧义最佳的模板...(模板备选集合)中一个一个匹配,找到最优匹配的模板定义, Failure:在模板集中,单个匹配失败; Error:在模板集中,所有的匹配失败; 所以单个匹配失败,不能报错误,只有所有的匹配都失败了才报错误...Generic Programming(泛型编程) 由于模板这种对类型强有力的抽象能力,能让容器和算法更加通用,这一系列的编程手法,慢慢引申出一种新的编程范式:泛型编程。...泛型编程是对类型的抽象接口进行编程,STL库就是泛型编程经典范例。 ? C++模版的展望 1....模板的未来 随着模板衍生出来的泛型编程,模板元编程,模板函数式编程等理念的发展,将来也许会发展出更抽象,更通用编程理念。

    1.7K30

    一个故事读懂Java泛型

    国王看着这些不干事儿的官僚,恨得牙痒痒:“哼哼! 你们没有,朕这里可是有啊,来人,宣C++帝国的使者进殿!” 2 C++使者 一个年轻人在大家狐疑的目光中走了进来, 在大殿中央给国王行了礼。...国王说道:“这是C++国王来的使者,他带来了一个我们帝国没有的新玩意儿。 泛型先生,你一路舟车劳顿,辛苦了,烦请你给我们说说C++王国的泛型吧。”...我们C++帝国把这种能力称为泛型(Generics) ” 集合框架大臣笑道: “哈哈,这么古怪的语法,怪不得你们C++越来越.... ” 一转眼看到Java国王那威严的目光, 他生生地把后半句给咽了进去...4 泛型方法 集合框架大臣说: “陛下,刚才您说的都是泛型类, 对于一些静态方法该怎么办?” ? ? “简单啊,把那个移到方法上去!” 国王的命令不容置疑 ? ?...泛型大臣说:“陛下明鉴,这个Apple 虽然是Fruit的子类, 但是 ArrayList却不是 ArrayList的子类,实际上他们俩之间是没有关系的,不能做转型操作,所以调用

    60740

    C++【模板进阶】

    、Date 等,模板参数除了可以匹配类型外,还可以匹配常量(非类型),完成如数组、位图等结构的大小确定 1.1、使用方法 在定义模板参数时,不再使用 class 或 typename,而是直接使用具体的类型...通常情况下,模板可以帮我们实现一些与类型无关的代码,但在某些场景中,【泛型】无法满足调用方的精准需求,此时会引发错误,比如使用 日期类对象指针 构建优先级队列后,若不编写对应的仿函数,则比较结果会变为未定义...详见 《C++ STL学习之【优先级队列】》 原因:泛型思想无法满足特殊场景 解决方案:利用模板的特化制定更加精准的比较逻辑 综上所述,所谓模板的特化,就是在原模板的基础之上,对原模板进行特殊化处理...,必然失败 简单举个例子:抛开模板这个东西,在头文件中声明函数,但不定义,调用函数时,报的就是链接错误 Test.h #pragma once //只声明,不定义 void sub(int x,...,假若没有模板、没有泛型编程思想,那么恐怕 "STL" 会变得非常大 模板的优点 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生 增强了代码的灵活性 模板的缺点 模板会导致代码膨胀问题

    17610

    《揭秘 C++:确保模板函数重载决议正确的秘籍》

    在 C++的世界里,模板函数为我们带来了强大的泛型编程能力。然而,与之相伴的模板函数重载决议问题却常常像隐藏在暗处的礁石,让开发者在编程的海洋中不慎触礁。...在复杂的 C++项目中,尤其是涉及大量泛型代码的场景,这一问题的影响会被放大,可能让调试工作变得异常艰难。...这可能导致编译器在选择特殊化版本时出现错误,使得不符合预期的模板函数被调用。...五、总结 模板函数重载决议是 C++编程中一个复杂而又关键的问题。在实际开发中,我们需要深入理解其原理和影响因素,避免常见的错误场景,通过合理的设计方法来确保重载决议的正确性。...只有这样,我们才能充分发挥模板函数的强大功能,写出可靠、高效的 C++代码,让我们的程序在泛型编程的道路上顺利前行,避免因重载决议错误而带来的各种隐患。

    12210

    【C++】泛型编程——模板初阶

    泛型编程 首先我们来思考一个问题:如何实现一个通用的交换函数呢? 即我们想交换两个变量,这两个变量可以是整型,也可以是浮点型,或者其它内置类型,然后它们的交换都可以用一个函数完成。...这几个函数的函数名相同,只是参数列表不同,构成重载,这样我们想交换不同类型的变量,都是去调用Swap函数,然后根据参数类型的不同,会自动匹配去调用对应的交换函数。...巧的是前人早已将此树栽好,我们只需在此乘凉: C++引入了泛型编程,就可以解决这个问题。 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。...模板是泛型编程的基础,又分为函数模板和类模板。 借助模板,我们就可以解决上面的问题。 2. 函数模板 那我们先来学习一下函数模板。...另外再给大家提一个东西就是: 其实swap这个函数C++库里面是提供了的,我们可以直接用: 不过库里面的是小写,我们自己刚才的写成大写区分一下,所以以后我们再用swap就不用自己写了。

    15810
    领券