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

用模板重载现有函数是不是一种糟糕的做法?

用模板重载现有函数是一种常见的编程技术,它可以为不同类型的参数提供相同的函数接口,从而提高代码的复用性和灵活性。然而,滥用模板重载可能会导致代码可读性降低、维护困难等问题。

优势:

  1. 代码复用:通过模板重载,可以为不同类型的参数提供相同的函数接口,避免重复编写相似的代码。
  2. 灵活性:模板重载可以根据不同的参数类型选择不同的实现,提供更灵活的功能扩展。
  3. 性能优化:模板重载可以根据参数类型选择最优的实现,提高代码的执行效率。

应用场景:

  1. 容器类:例如,可以使用模板重载来实现通用的容器类,支持不同类型的元素。
  2. 算法类:例如,可以使用模板重载来实现通用的排序算法,支持不同类型的数据。
  3. 数据结构类:例如,可以使用模板重载来实现通用的链表、树等数据结构,支持不同类型的数据。

推荐的腾讯云相关产品和产品介绍链接地址:

  1. 云函数(Serverless):腾讯云云函数是一种事件驱动的无服务器计算服务,可帮助开发者在云端运行代码,无需关心服务器管理和运维。详情请参考:云函数产品介绍
  2. 云数据库 MySQL 版:腾讯云数据库 MySQL 版是一种高性能、可扩展的关系型数据库服务,适用于各种规模的应用程序。详情请参考:云数据库 MySQL 版产品介绍
  3. 云原生容器服务:腾讯云原生容器服务(TKE)是一种高度可扩展的容器管理服务,支持容器化应用的部署、运行和管理。详情请参考:云原生容器服务产品介绍

需要注意的是,以上推荐的腾讯云产品仅供参考,具体选择应根据实际需求和项目情况进行评估。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【笔记】《C++Primer》—— 第16章:模板与泛型编程

*inp; } 有时候我们无法直接得到所需要类型,因为我们对会传递进来参数类型实际上几乎一无所知,甚至不知道它是不是指针是不是引用是不是右值引用之类,我们需要能够动态地将这些语言特性消去从传入参数中提取出我们想要类型...当我们函数模板来得到函数指针时,编译器会按照函数指针类型来确定模板类型,如果不能从指针确定类型,则直接报错。...然后再用得到信息正确参数传递给其他函数,这就是转发操作 16.3 重载模板 函数模板可以被另一个模板或非模板函数重载,与平时一样名字相同函数需要参数不同才能重载 但是对于函数模板来说,实参调用函数会是重载版本中哪一个需要按照以下规则来判断...,编译器也会从模板函数中实例化出可以调用合适函数 因此一般在编写重载函数时候会编写多个比较特例函数然后保留一个接受const T&模板函数来兜底防止失去匹配 在定义任何函数前异地你更要记得声明所有重载函数版本防止编译器忽略你想要版本而实例化了另一个...可变参数模板函数通常是一种递归函数,一般我们编写时候都会递归地分析包中内容并调用直到终止,将包中内容分解成元素称为包扩展 包扩展一种用法是用来扩展提取输入参数: // 递归终止函数,一般是处理参数包最后一个函数

1.5K30

【C++】STL——list深度剖析 及 模拟实现

迭代器功能分类 所以呢: 虽然库里sort是一个函数模板,理论而言这里可以传任意类型参数,但是其内部对使用迭代器有要求,参数名字就暗示了我们要传随机迭代器。...list迭代器用原生指针实现可行吗?或者说原生指针实现有没有什么问题呢? ,list里面是一个一个结点,如果我们结点指针node*的话,首先它解引用是啥?...C++规定:后置++重载时多增加一个int类型参数,但调用函数时该参数不用传递(它作用就是为了构成重载),编译器自动传递。...但是正常情况下,我们拿到一个结构体指针或类对象指针去访问它成员,会先解引用,再通过.去访问吗? 是不是可以直接->啊。 所以: 基于这样原因,我们迭代器也需要重载一下->。...就像前面我们讲过前置++后置++重载区分那种情况。 第三个模板参数 那现在回到我们上面的那个问题: 为什么还有第三个模板参数Ptr?

19210
  • C++面向对象程序设计_Part1

    模板可以只写一份模板代码,需要生成不同类型class,编译器会自动生成,具体做法是在类定义最上方加入template ,然后讲所有的double都换成T即可,在初始化时候,在类后面使用尖括号,尖括号中放入你想要生成类型即可...是一种空间换取时间做法,当函数行数只有几行时候,应该将函数设置为内联,提高程序整体运行效率。更加详细说明可以参考这篇文章....参数传递分为两种:pass-by-value和pass-by-reference 一条非常考验你是否受过良好c++训练就是看你是不是pass-by-reference。...\0'),都是string内部指针指向动态分布内存头部。...首先是拷贝构造,由于是构造函数一种,跟之前构造函数一样,需要分配一块内存,大小为要拷贝string长度+1,然后使用C语言自带strcpy进行逐个赋值。 ?

    96820

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

    但是呢,还是有一些不好地方: 使用函数重载虽然可以实现,但是有一下几个不好地方: 重载函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应函数 代码可维护性比较低...,一个出错可能所有的重载均出错 这些重载函数呢,干的事情都是一样,只是处理数据类型不同。...那现在我们交换不同类型变量,还需要一种类型写一个嘛,不需要了,这一个就够了: 是不是就搞定了啊。...但是: 我们刚才写是个啥,是一个具体函数吗? 是不是一个函数模板啊,并不是一个函数。 如果我们去观察汇编的话会发现它们两个去call函数是不一样,并不是一个。...像我们刚才上面就是强制类型转换。 但是当前这种情况要调非模板函数毕竟还得进行一个类型转换,而我们得第二个函数模板有两个参数T1和T2,那调用时候模板是不是可以产生一个具有更好匹配函数

    14410

    Google C++ 编程风格指南(五):其他 C++ 特性

    函数重载 若要用好函数重载,最好能让读者一看调用点(call site)就胸有成竹,不用花心思猜测调用重载函数到底是哪一种。该规则适用于构造函数。...模板化代码需要重载, 同时为使用者带来便利....另外,当派生类只重载了某个函数部分变体,继承语义容易令人困惑。 结论: 如果您打算重载一个函数, 可以试试改在函数名里加上参数信息。...即在一个现有函数添加缺省参数,就会改变它类型,那么调用其地址代码可能会出错,不过函数重载就没这问题了。...如果你使用递归模板实例化, 或者类型列表, 或者元函数, 又或者表达式模板, 或者依赖SFINAE, 或者sizeof trick 手段来检查函数是否重载, 那么这说明你模板太多了, 这些模板太复杂了

    1.1K30

    【笔记】《C++Primer》—— 第三部分:类设计者工具

    默认情况下lambda表达式不能改变它捕获变量因为它函数调用运算符被重载为const 标准库functional中定义了一系列表示算术运算符,赋值运算符和默认析构函数模板类,我们可以这些类替换掉默认运算符改变容器操作...将类朝bool类型进行转换是最常见一种做法,但C11加入了显式类型转换来限制它,编译器不会隐式进行这个转换,也就是我们必须使用强制类型转换才能使用。...因此除了重载函数外最好不要让名称同名 派生类可以覆盖基类重载函数,但是如果派生类希望基类重载几个函数都在派生类中可见的话:一种方法是不覆盖任何一个重载函数或将所有重载函数都进行一次覆盖;另一种方法是为需要重载函数名使用...,做法和默认函数实参类似但是写在模板参数列表里,也只能出现在最右侧 当需要在类外部定义类成员模板时,要注意此时需要两个template连用来说明标识符 extern显式实例化会实例化模板所有成员,包括内联成员函数...,那些可变参数部分称为参数包,由省略号...标记 可变参数模板函数通常是一种递归函数,一般我们编写时候都会递归地分析包中内容并调用直到终止,将包中内容分解成元素称为包扩展 包扩展一种用法是用来扩展提取输入参数

    1.7K10

    Chapter 5: Rvalue References, Move Semantics, PF

    如果对传入对象p加上const修饰,那么虽然模板函数虽然会被实例化成为一个接收const类型Person对象函数,但是具有在const类型参数所有重载函数中,C++中重载解析规则是:当模板实例函数和非模板函数同样都能匹配一个函数调用...一种高级做法,使用标签分发方式(Tag dispatch) 传递const左值引用和传值方式都不支持完美转发,如果使用通用引用是为了完美转发,那就不得不使用通用引用,同时如果不想放弃重载,就需要在特定条件下强制模板函数匹配无效...这种做法核心是存在一个未重载函数作为客户端API,然后将任务分发到其他实现函数中。...另一种高级做法,限制(constraining)采用通用应用模板 为了在特定条件下,让函数调用发生在应该发生位置上,我们需要根据条件来启用/禁用模板匹配,方式是std::enable_if,如果内部判断条件为...但是上述行为实际上是依赖于编译器,安全做法是在cpp文件中定义一次MinVals constexpr std::size_t Widget::MinVals; 重载函数名和模板自动推导 一个模板函数接收重载函数作为参数时

    5.1K40

    《Effective C++》学习笔记

    由于函数重载特性,当const和non-const成员函数有实质等价实现时,non-const版本调用const版本来避免代码重复,但不要反过来调用,这不符合逻辑。...模板接口是隐式(由模板函数实现代码所决定其模板对象需要支持哪些接口),多态通过模板具现化和函数重载解析在编译期体现,也就是编译期就可以赋予不同对象于模板函数。...往往可消除,做法是将该参数改为函数参数或者类成员变量,而不要放到模板参数中。...做法是声明一个泛化构造函数,也就是定义一个模板构造函数,接收模板参数,声明一个指向真实对象指针,声明一个获取该对象指针get函数该get函数放在初始化列表中来构造模板类。...实现方式以模板为基础,因为模板会在编译时确定,上一条款traits classes就是一种TMP,依靠模板函数参数不同重载来在编译器模拟if else(其在运行期才会判断)。

    1.1K20

    【笔记】《Effective C++》条款26-55

    如果可以, 尽量class声明式来替换class定义式 6 继承与面向对象设计 32 确定你public继承塑模出is-a关系 公有继承意味着派生类"is-a"是一种基类, 正如鸽子是一种鸟 所以公有继承需要主张...>::foo;将名字人工指定(这里并非暴露名称, 而是类似提前声明) 直接指定基类来调用函数Base::foo();, 这是最不被推荐做法, 因为这种做法完全关闭了虚函数绑定行为 44 将与参数无关代码抽离...其本质是一种协议, 且运行在编译期 traits标准版本由一个由非常多偏特化版本模板类经过复杂重载形成, 我们通过对需要被traits提取信息类自己声明出对应typedef, 将自己类所属类型...(例如池分配)和对内存分配志记操作 如果要写自己内存分配器的话, 要注意令返回指针有正确字节对齐, 建议还是现有的其他人写可靠分配器 51 编写new和delete时需固守常规 编写new...delete 一种简单方法是一个类似下图基类写好常用new和delete, 然后继承即可.

    92830

    真没想到nullptr和NULL得区别,大了去了

    // 在构造函数重载决议期间,只要有任何可能,大括号初始化物就会与带有std: : initializer_ list 型别的形参相匹配,即使其他重载版本有着貌似更 加匹配形参表 。...条款8:优先选用nullptr,而非0或NULL // 0 型别是 int, 0 和 NULL 都不具备指针型别 //情况1:重载函数 //情况1: 重载函数 void f(int);//f 三个重载版本...(void*) //nullptr 优点是,它不具备整型型别,也不具备指针型别,但你可以把它想成一种任意型别的指针 f(nullptr);//调用 f(void*)这个重载版本 //情况2:auto...//通不过编译得做法 //通不过编译得做法 class Widget{ public: ......}; //改用删除函数来实现有两大好处 //1, 它们根本不需要不同得访问层级 //2,因为成员函数模板可以在类外(名字空间作用域)被删除 class Widget{ public:

    1.8K30

    【C++】 使用红黑树模拟实现STL中map与set

    当然从表面上来看他之所以这样做原因是他和map是同一个红黑树模板,而这个类模板是有两个参数,所以它必须传两个。 那红黑树为什么要这样设计呢?...这些函数就可以以一种统一实现(即都用第一个模板参数接收key去查找),这样map和set才可以共同复用同一个红黑树模板类。...而map里面元素比较我们是不是期望只按照那个key也就是pair.first比较啊 那我们怎么去解决这个问题啊: 那这个地方库里面的做法是比较不错,我们可以来学习一下 再来看源码里面红黑树结构...+和- -重载,这两个重载之后我们就可以使用迭代器遍历红黑树了(后面封装好就是遍历map和set),那我们来讲一下: 其实这里相当于我们要搞出一种遍历二叉树方式,之前我们学了递归和利用栈非递归方式...3.8 map[]重载 那map与set不同是不是他还重载了[]啊,这个我们之前在map和set使用那篇文章也讲过。

    15610

    模板(上)——(函数模板

    当编译系统在程序中发现有函数模板中相匹配函数调用时,便产生一个重载函数,该重载函数函数体与函数模板函数体相同,该重载函数就是模板函数。...//以上边函数模板为例 T abs(T x) { if (x<0) return -x; else return x; } 3.在函数头前关键字template引出对函数参数名定义。...将数据类型形参实例化参数称为模板实参,模板实参实例化函数就是模板函数模板函数生成就是将函数模板类型形参实例化过程。...:(" << s3.getx() << "," << s3.gety() << "," << ")"; system("pause"); } 重载函数模板 函数模板本身可以多种方式重载,还需要提供其他函数模板...函数调用匹配 函数模板与同名函数模板重载方法均遵循规定: (1)寻找一个参数完全匹配函数,如果找到了就调用它。

    1.5K20

    【C++】STL——容器适配器priority_queue(优先级队列)详解 及 仿函数介绍和使用

    我们一起来认识一下priority_queue: 优先队列是一种容器适配器,根据严格弱排序标准,它第一个元素总是它所包含元素中最大。...他也是STL六大组件之一。 那什么是仿函数呢? ,仿函数(又称函数对象)其实就是一个类重载了(),使得这个类使用看上去像一个函数。...举个栗子: 我们来写一个判断小于仿函数,怎么做呢? 定义一个类,重载一下()就行了,函数实现根据我们需求去写: ps:也可以class,区别只是它默认访问限定符不同。...那这里为什么可以,其实是因为我们日期类重载了>和<,因为它里面建堆过程是不是要进行比较啊。 如果没有>和<重载就不行了。...指针是内置类型,我们也没法重载比较操作,那怎么办呢? 我们是不是可以使用仿函数来解决啊。 然后我们再运行: 就会发现结果正确并且不会变化了。

    5.6K31

    模版初阶

    泛类编程 泛型编程:编写与类型无关通用代码,是代码复用一种手段。...,代码复用率比较低,只要有新类型出现时,就需要用户自己增 加对应函数 代码可维护性比较低,一个出错可能所有的重载均出错 如上列代码,靠函数重载进行实现多个不同数据类型变量完成交换,过于繁杂且代码量大...,typename Tn> 返回值类型 函数名(参数列表){} 每一个T代表一种数据类型,一个模版对应一个函数 注意:typename是用来定义模板参数关键字,**也可以使用class(**切记:不能使用...比如:当用double类型使用函数模板时,编译器通过对实参类型推演,将T确定为double类型,然后产生一份专门处理double类型代码(double替换T),对于字符类型也是如此 函数模版实例化...模板参数实例化分为: 隐式实例化 显式实例化 现有一加法模版函数: template T Add(const T& left, const T& right) { return

    7110

    曾遭 Linus 炮轰“很烂” C++,现受开发者支持:Linux 内核应从 C 转到 C++!

    这将允许主线内核使用内联模板函数、内联重载函数、类继承以及其他目前 Linux 内核 C 代码不支持功能。...虽然早期版本可以使用大量 SFINAE hacks(Substitution Failure Is Not An Error,是 C++ 语言中一种特性,允许开发人员在编译时根据类型条件来选择模板特化版本...当 Linus 知晓此事后,直接进行了反击还怒批道,C++ 是一门糟糕语言。它之所以糟糕,是因为有很多水平一般程序员使用它,导致代码质量低下。...,而现有的 C 代码经过一些清理就可以编译为 C++。...如果 OOP、异常或 RTTI 在内核中没有意义的话,Linux 就不需要使用它们,但更安全模板元编程和概念来取代 C 语言中容易出错宏,会让错误较少代码编程变得更容易。

    83710

    【C++】list迭代器深度剖析及模拟实现(感受类封装,类和对象思想)

    在类里面定义内嵌类型一般有两种方式,一种是typedef,另一种就是内部类,C++不太喜欢内部类这种方式,可能是因为代码维护性较低,所以弃用了内部类这样方式。...list迭代器我们是类模板定义出来,也就是自定义类型迭代器。vector迭代器我们是原生指针定义出来,也就是内置类型迭代器。...,根据类模板参数不同,实例化出不同类(大佬做法) 1....上面重建一个类,这样代码冗余做法大佬是要被笑话,尤其STL还是开源代码,大佬其实是通过增加模板参数,在传参数时,根据参数类型不同实例化出不同类。 2....例如下面代码,const_iterator时,就是第二个模板参数为const T&模板,等T类型确定时,就会实例化出具体类,当用iterator时,我们就用第二个模板参数为T&模板,等T类型确定时

    98810

    C++智能指针简介

    所有的智能指针都会重载->和*操作符。智能指针主要作用就是栈智能指针离开作用域自动销毁时调用析构函数来释放资源。当然,智能指针还不止这些,还包括复制时可以修改源对象等。...大多数C++类三种方法之一来管理指针成员: (1)不管指针成员。复制时只复制指针,不复制指针指向对象实体。当其中一个指针把其指向对象空间释放后,其它指针都成了悬挂指针。这是一种极端做法。...有时候获得资源被拿来赋值(而非初始化)某个资源管理对象,但不论哪一种做法,获得一笔资源后应该立即放进资源管理对象中。...智能指针就是一种资源管理对象,提供功能主要有如下几种: (1)以指针行为方式访问所管理对象,需要重载指针->操作符; (2)解引用(Dereferencing),获取所管理对象,需要重载解引用...SmartPointer(T *p) : _ptr(p) //构造函数 { } T& operator *() //重载*操作符 {

    1.1K30

    Java系列 | 属性依赖注入被认为是有害

    简介 在依赖注入框架中,字段注入是一种非常流行做法,例如Spring。然而,它有几个严重权衡因素,一般来说应该避免。 注入类型 有三种主要方式可以将你依赖注入到你类中。...正如你所看到,Field变量看起来非常漂亮。它很短,很简洁,没有模板代码。这段代码很容易阅读和浏览。 你类可以只关注重要东西,而不被DI模板所污染。...当你使用构造函数进行DI时,到了一定程度后,构造函数参数数量变得太多,就会立刻发现有问题。 有太多依赖关系通常意味着这个类有太多责任。...这实际上是一件好事,而不是限制,因为循环依赖应该被避免,而且通常是一个糟糕设计标志。这种方式可以防止这种做法。 另一个好处是,如果使用spring 4.3+,你可以将你类与DI框架完全解耦。...此外,注入构造函数组件总是以完全初始化状态返回给客户端(调用)代码。 顺便提一下,大量构造函数参数是一种不好代码气味,意味着该类可能有太多责任,应该重构以更好地解决适当分离问题。

    73520
    领券