模板
文章平均质量分 80
fpcc
行之苟有恒,久久自芬芳!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
模板编程—模板类参数的特化顺序
这篇文章主要探讨了C++模板特化中的参数顺序问题。首先介绍了模板特化的两种形式:全特化和偏特化,并指出参数特化是按位置匹配而非名称。然后分析了模板参数特化的顺序规则,强调必须严格按照主模板声明顺序进行,包括变参模板、模板的模板参数等特殊情况。接着通过一个典型例子展示了参数顺序错误导致的模糊匹配问题,如同时存在Test<T,int>和Test<int,U>特化时,Test<int,int>会引发编译错误。文章最后指出模板编程虽复杂,但只要掌握基础规则就能应对大多数问题。原创 2026-08-07 11:07:09 · 571 阅读 · 0 评论 -
c++编程实践—宏和模板
本文探讨了C/C++中宏和模板的优缺点及应用场景。宏作为预编译指令具有灵活性和跨平台优势,但缺乏类型安全、调试困难;模板则提供更好的类型检查、错误处理机制,但会增加编译时间和代码膨胀。二者都支持编译期处理和代码复用,但在类型安全、作用域管理等方面存在差异。建议优先使用模板,仅在必要场景谨慎使用宏。C++11引入的constexpr可作为二者的替代方案,实现更安全的编译期计算。开发者应根据具体需求选择合适技术,平衡性能与可维护性。原创 2026-05-19 13:17:15 · 764 阅读 · 0 评论 -
模板编程—模板显式实例化的问题
对模板编程中的显式实例化遇到的问题进行分析和说明原创 2026-03-10 10:17:02 · 553 阅读 · 0 评论 -
C++编程实践—智能指针的自定义删除器
本文分析了C++智能指针中自定义删除器的作用与应用。自定义删除器允许开发者灵活管理非内存资源(如文件句柄、Socket等)或特殊内存分配(如malloc分配的内存)。删除器类型包括函数指针、仿函数、Lambda表达式等可调用对象,但需注意捕获变量的生命周期问题。应用场景包括跨平台开发、PIMPL模式、资源条件控制等。文章通过三个示例(PIMPL析构、仿函数删除器、Lambda删除器)展示了具体实现方法。自定义删除器虽灵活,但需谨慎使用以避免资源泄漏和性能问题。原创 2026-03-06 09:45:11 · 397 阅读 · 0 评论 -
跟我学C++中级篇——Concepts的循环依赖
本文探讨了C++20概念(Concepts)中可能出现的循环依赖问题。文章指出,循环依赖在复杂模板编程中可能出现,表现为多个概念间的相互约束,类似于数学定理间的循环证明。通过示例代码展示了概念A依赖B、B又依赖A的典型循环场景。为解决这一问题,提出了三种设计方法:高层抽象、减少互相约束、分解复杂概念;以及两种编程技巧:使用前向声明和延迟加载约束检查。最后强调良好的设计思想是避免概念循环依赖的关键,编程技巧只是辅助手段。全文为处理C++概念循环依赖提供了实用指导。原创 2026-02-12 09:45:39 · 540 阅读 · 0 评论 -
模板编程—模板的编译
本文深入分析了模板编译的核心机制与关键技术。首先对比了模板编译与普通代码编译的异同,重点阐述了模板特有的两阶段查找机制(Two-Phase Lookup)及其对依赖名称的处理方式。其次详细解读了CTAD(类模板参数推导)和ADL(参数依赖查找)两项关键技术在实际开发中的应用场景和配合方式。通过具体代码示例,展示了如何结合使用这些技术来解决模板开发中的典型问题。文章强调理解模板编译原理对提升开发能力的重要性,指出虽然编译问题复杂且小众,但掌握其底层机制能帮助开发者更好地进行模板设计与优化。原创 2026-02-10 11:19:12 · 537 阅读 · 1 评论 -
模板编程——std::is_pointer的分析
本文分析了C++标准库中的std::is_pointer元编程接口,指出其只能检查最外层指针类型(包括void指针但不包括成员指针)。通过示例展示了正确用法和常见误用情况,如处理多级指针和成员指针时的潜在问题。针对多级指针检测,提出了使用std::remove_pointer递归判断的解决方案。文章强调使用标准库接口时必须严格遵循说明文档,建议开发者通过测试验证确保代码健壮性。这些注意事项对提高元编程代码质量具有重要意义。原创 2026-02-05 13:06:06 · 419 阅读 · 0 评论 -
模板编程—C++不支持模板分离编译分析
摘要:C++模板编译具有特殊性,不同于普通代码的编译过程。由于模板采用延迟加载机制,只有在实例化时才会生成具体代码,这导致模板不支持分离编译(声明在头文件而实现在cpp文件)。实验表明,当模板函数未被调用时不会生成对应代码,从而引发链接错误。因此模板代码通常需要完整定义在头文件中,以确保编译器在需要时能正确实例化模板。这种特性也解释了为何模板相关问题常在链接阶段显现。原创 2026-02-05 07:46:53 · 976 阅读 · 0 评论 -
模板编程—模板编程处理curry
本文探讨了函数柯里化(Currying)的概念及其在C++中的实现方法。柯里化将多参数函数转换为一系列单参数函数链,与部分应用(Partial Application)不同,它通过嵌套函数实现参数逐步传递。文章展示了Python示例和C++的三种实现方式:lambda表达式、模板类和C++20标准实现,并分析了优缺点。柯里化能提高代码模块化和复用性,支持延迟计算和函数组合,但也可能增加运行开销和调试难度。典型应用场景包括函数组合、延迟计算和函数式编程实现。通过柯里化技术,开发者可以在C++中实现类似函数式编原创 2026-01-19 10:55:29 · 643 阅读 · 0 评论 -
模板编程—模板编程处理Partial application
本文介绍了函数式编程中的部分应用(Partial application)概念及其在C++中的实现方式。部分应用是指固定多参函数的部分参数来创建新函数的技术,类似于数学中的逐步消元过程。文章展示了Python示例,并通过C++模板编程、Lambda表达式(C++11/14/17)、C++20参数包展开以及C++23的std::bind_front等多种实现方式。该技术具有惰性求值特性,适用于配置处理、数据计算、算法控制和动态任务管理等场景,最后给出了一个任务管理系统的实现示例。原创 2026-01-16 07:42:25 · 831 阅读 · 1 评论 -
跟我学C++中统篇—STL中的bind
本文对比分析了C++标准库中的三种函数绑定工具:std::bind、std::bind_front和std::bind_back。std::bind作为最早提供的绑定接口,功能最全面但使用较复杂,支持参数占位符和任意重排。C++20/23新增的std::bind_front和std::bind_back则专注于前/后N个参数的绑定,使用更简单且性能更好。三者主要区别在于:占位符支持、参数重排能力、性能表现和使用复杂度。随着标准演进,bind_front/bind_back通过简化绑定操作和优化性能,为开发者原创 2026-01-15 10:43:27 · 961 阅读 · 1 评论 -
跟我学C++中级篇—std::is_swappable手动实现
C++17引入了std::is_swappable系列类型特性,用于在编译期判断类型是否可交换。文章分析了标准库实现原理,并通过自定义实现展示了其核心机制:利用SFINAE技术,通过decltype和declval构造swap调用表达式,成功则返回true_type,否则返回false_type。同时提供了is_nothrow_swappable版本用于检查无异常保证的交换操作。这类元编程工具依赖于std::true_type、std::void_t等基础组件,通过编译期表达式求值实现类型特性的检测,为模板原创 2026-01-14 10:45:52 · 331 阅读 · 1 评论 -
跟我学C++中级篇—std::conjunction手动实现
本文探讨了C++17之前如何实现元编程中的逻辑模板操作,以std::conjunction为例进行了逆向分析。通过对比标准库实现与自定义实现,展示了两种相似的递归模板实现方式:标准库使用conditional_t递归处理,而自定义版本采用integral_constant结合递归展开。文章提供了一个完整的测试用例,验证了自定义逻辑模板__and_t__的正确性,包括对结构体成员函数和类型特征的复合检查。通过模板特化和递归展开的机制,实现了与标准库conjunction相同的逻辑与操作功能。原创 2026-01-13 12:27:23 · 455 阅读 · 0 评论 -
跟我学C++中级篇—C++17中的元编程逻辑操作
本文探讨了C++中的两类逻辑操作:运行时逻辑运算符(&&,||,!)和编译期元编程逻辑模板(std::conjunction,std::disjunction,std::negation)。前者用于运行时条件判断,后者在编译期进行类型检查与模板特化。文章详细介绍了三种元编程逻辑模板的用法,包括短路特性、辅助变量模板及其在SFINAE、类型约束等场景的应用。最后对比了两类逻辑操作的主要区别:应用时期不同(运行时vs编译期)、处理对象不同(值vs类型)以及实现机制差异。这些元编程工具为C++模板原创 2026-01-12 10:41:20 · 566 阅读 · 0 评论 -
模板编程—模板和元编程中的错误输出
本文探讨了泛型编程中的编译错误调试方法。针对模板编程中常见的类型不匹配、约束检查失败等问题,提出了多种编译期调试手段:1)使用static_assert进行静态断言;2)利用#warning或#pragma message输出预处理信息;3)通过SFINAE技术结合static_assert输出错误;4)自定义错误输出模板;5)使用宏定义辅助调试。文章详细介绍了各种方法的实现原理,并提供了具体示例代码,特别是展示了如何利用编译错误信息输出调试内容。最后强调开发者应积累自定义辅助类,以更高效地定位和解决泛型编原创 2026-01-09 08:14:44 · 1069 阅读 · 1 评论 -
跟我学C++中级篇——取地址操作
本文分析了C++中取地址操作的两种方式:传统"&"运算符和C++11引入的std::addressof函数。文章详细介绍了std::addressof的实现原理,包括基于编译器内置函数和非内置函数的两种实现方式,并解释了其强制转换为char引用的原因。通过示例说明了当类重载了&运算符时,std::addressof仍能正确获取对象地址的特性。最后总结了std::addressof的应用场景和限制,指出它是"&"运算符的完善补充,特别适用于模板编原创 2026-01-06 11:49:15 · 900 阅读 · 0 评论 -
跟我学C++中级篇——is_detected的手动实现
本文介绍了C++中的"检测习惯用法"(detection idiom)技术,该技术由Walter E. Brown提出,用于在编译期检测类型特性是否存在或表达式是否有效。虽然is_detected未能进入C++17标准库,但其功能已被std::void_t和C++20概念部分替代。文章详细分析了实验库中的is_detected定义及其三种主要用途:检测类型特性、验证表达式有效性和控制编译分支。通过示例代码展示了如何检测类的复制赋值操作符是否存在等实际应用,并提供了手动实现的代码方案,包括原创 2026-01-03 09:53:16 · 643 阅读 · 0 评论 -
跟我学C++中级篇——类型检测和安全控制
本文系统梳理了C++中类型检测与安全控制的技术方法。编译期技术包括SFINAE、标准库元编程接口、C++20概念、自定义模板及断言等;运行期技术涵盖RTTI、接口限制、容器检测和类型转换等。文章分析了各类技术的优缺点:编译期方法功能强大但复杂度高,运行期方法简单但扩展性差。在应用场景上,编译期技术适合基础库开发,运行期技术更适合常规开发。通过实例代码展示了运行时类型检测和编译期模板检测的具体实现,为开发者选择合适的技术方案提供了参考指南。原创 2026-01-02 08:11:34 · 740 阅读 · 0 评论 -
C++编程实践—false_type和true_type的实践应用
本文系统介绍了C++中std::true_type和std::false_type的应用方式。这两种类型继承自std::integral_constant<bool, true/false>,主要用于模板元编程。其应用形式包括:1)作为基类实现类型特征检测(如std::is_pointer);2)用于标签分发处理,通过函数重载实现不同的处理逻辑。文中给出了类型转换检查的实现示例,并展示了std::is_function的源码实现,说明如何通过特化继承true_type/false_type来实现原创 2026-01-01 09:43:06 · 1081 阅读 · 0 评论 -
C++编程实践——std::void_t的实践应用
本文分析了C++17中的std::void_t及其工程应用。std::void_t通过变参模板将任意类型映射为void,其本质依赖SFINAE技术。文章详细介绍了std::void_t的三种主要应用方式:作为默认参数、触发SFINAE和模板特化处理,并列举了类型特性检测、成员变量/函数检测等典型应用场景。通过具体示例代码展示了std::void_t在检测类型别名、成员变量、成员函数和智能指针等方面的实际应用。std::void_t虽在C++17标准化,但其思想早被实践,是SFINAE和模板特化的重要工具,值原创 2026-01-01 09:41:22 · 613 阅读 · 0 评论 -
C++编程实践——模板的显式实例化
本文介绍了C++模板中的显式实例化概念及其应用。显式实例化是开发者手动为模板指定具体类型的实现方式,区别于隐式实例化和全特化。文章通过代码示例展示了显式实例化的语法特征,并分析了其与全特化的关键区别:显式实例化不需要重新实现模板代码。此外,文章阐述了显式实例化的优势,包括减少代码膨胀、提高链接效率等,并指出其必须定义在.cpp文件中以避免重复定义。最后,文章列举了显式实例化的典型应用场景,如库开发、类型控制和代码优化,并通过实例代码演示了编译后的具体实现形式。作者强调模板学习需要理论与实践相结合,随着C++原创 2025-12-24 12:18:29 · 1033 阅读 · 2 评论 -
C++编程实践——可变参数模板分析
本文探讨了C++可变参数模板的必要性及其在分布式系统中的应用挑战。随着跨进程通信需求增长,传统强类型语言面临运行时参数不确定性的问题。文章分析了变参模板如何通过编译期类型检查、完美转发等机制保证类型安全,并介绍了C++11到C++26标准对参数包处理的改进。针对分布式场景,提出四种解决方案:开发者自定义、显式封装逻辑、模板元编程及反射技术,强调应根据实际需求选择合适方法。最后指出理解技术演进背景的重要性,避免在实践过程中重复前人的弯路。原创 2025-12-17 15:34:39 · 332 阅读 · 0 评论 -
C++编程实践——标准库overloaded实现分析
本文分析了C++模板技术中overloaded结构体的应用与实现原理。通过std::variant和std::visit的示例代码,展示了如何利用模板继承和运算符重载来创建可调用对象的集合。文章重点解析了overloaded模板的展开过程,揭示了其通过继承多个lambda表达式并引入各自operator()的实现机制。同时说明了std::decay_t用于类型退化、if constexpr实现编译期条件分支等技术细节。代码示例演示了如何针对不同类型参数进行差异化处理,为模板编程初学者提供了深入理解模板技术的原创 2025-11-24 12:38:28 · 119 阅读 · 0 评论 -
跟我学C++高级篇——CRTP的高级应用
CRTP是一种静态多态的实现方法。说的直白一些就是在正常的认知中,子类继承的是父类,但是如果父类是一个模板类,此模板类中的模板参数是子类的这种特殊情况。CRTP在前面说过两次,如果有对此技术不清楚的可以查看一下“跟我学c++中级篇——CRTP”以及“显式this的应用”中都进行过分析说明。CRTP本身就是一种很小众的技术应用,而它的一些应用,可能应用范围更小,下面就一些细节进行分析,扩展一下CRTP的更多的应用场景,给大家提供一些应用上的思路。CRTP的应用,相对来说就是一种比较复杂的应用。在前面将其基础原创 2025-02-08 21:13:38 · 733 阅读 · 0 评论 -
c++外部模板
模板的优势估计很多人都知道,但是模板的劣势也有不少,其中,代码膨胀就是其中之一(其它还有不易理解、不易调试等)。上面的示例代码非常简单,但可以说明一个问题,在上一篇中提到过,c++的编译是以CPP为单元进行的,模板如果不使用就不会生成代码,那么如果在两个CPP文件中使用一样的数据类型会产生什么样的情况呢?比如上在这种情形,都是int类型,只是数据略有不同。答案是编译器肯定会生成两个完全相同的函数。原创 2024-06-05 17:42:44 · 520 阅读 · 1 评论 -
C++的萃取技术
在《模板类型的自动推导》中提到了c++是一门静态编译语言,不支持动态类型的获取,也就更不用说提供类似c#,Java等语言的反射机制。但是,没有类型获取的接口不代表没有这种实际的需求,那么怎么解决这种需求就得靠c++的大牛们来想办法啦。微软的MFC通过大量的定义宏来动态的生成各种类和对象。而这种方式恰恰又不是c++大牛们觉得舒适的方法,所以他们想到了模板。在模板中,提供了Traits(萃取)技术,什么是萃取呢?简单来说,就是能够获得目标对象的类型,并依此而实现此类型对应的功能。原创 2024-03-10 10:58:01 · 1203 阅读 · 2 评论 -
跟我学c++中级篇——静态多态
从比较正式的定义来说,在c++中,一般不会把特定多态或者宏多态称为多态,以方便和C语言区分,一般来说,静态多态指的就是模板的静态多态。其实很多的定义和概念并不是说有多么特别的技术在内,很重要的一点在于通过这些定义或概念来更好的理解实际应用中的应用。可以简单将其当成一种对实际应用的抽象,从某种角度了对知识体系的一种系统的归类总结。这是学习编程的另外一种经验,大家可以借鉴一下。原创 2024-02-14 23:53:39 · 671 阅读 · 2 评论 -
跟我学C++中级篇——函数模板的匹配
在本文会尝试着把函数的重载以及模板自动推导等方法结合起来,一起分析模板函数的匹配的方式和原则。在普通的函数重载和普通的模板函数中,都比较容易理解调用哪一类,但在一些较为少用或者复杂的情况下,可能会发现一些特别的情况。这篇文章会针对这些情况进行一些具体的分析,并尝试着把一些疑惑解答分析出来。开发的过程其实是一个思维抽象再实践的过程。这个过程只有一条正确的路,就是用最简单(或者说尽可能简单)的方式来实现功能。所有的编程技巧,其终极的目标只有一个,让功能实现变得容易和安全,让代码更容易维护。原创 2024-02-07 20:44:00 · 1561 阅读 · 0 评论 -
跟我学C++中级篇——common_type的应用
它的使用比较有意思:1、如果无模板参数,则无类型。即sizeof…(T) 为零,则无成员 type2、如果一个模板参数,则等同于这个类型(std::common_type::type),否则也是无type3、如果有两个模板参数,要找一个可退化到相同的类型,否则无type;如果有自定义物化,则使用该特化;另外对于一些the conditional operator的操作按照相关的标准定义来操作。同时C++20中的新定义参看相关的新标准。原创 2024-02-02 21:11:16 · 1354 阅读 · 3 评论 -
跟我学C++编程中级篇——std::enable_if的使用
对于SFINAE(不清楚的可以翻一下以前的相关文章)开发者来说,std::enable_if是绕不开的一个小话题。在C++11至C++20间,其在模板的元编程中起到了重要的作用。不过在C++20后Cocepts可以实现更清晰更简单的方式。其实非常好理解,这个模板结构体的第一个参数是bool型,第二个默认是个void,就是说,第一个参数决定了是否启用第二个参数。这下就明白了吧。struct T {T(Floating) : m_type(float_t) {} // 错误:无法被重载。原创 2024-01-23 18:55:17 · 2211 阅读 · 0 评论 -
跟我学c++高级篇——静态反射实现之一
反射写起来非常头痛,一个是不知道如何说起更有系统性;另外一个就是哪种反射更有利于实际的应用。所以反射这个系列可能会是一个很长期的总结过程,大家不要着急,一定会把坑慢慢填好。原创 2023-11-26 12:38:57 · 1824 阅读 · 1 评论 -
跟我学c++中级篇——decay
对c++11中的std::decay的应用进行分析和说明原创 2022-11-29 12:05:09 · 1482 阅读 · 0 评论 -
using和typedef区别
在普通的类型名定义时,理论上讲二者是没有区别的,标准上是这样说的:A typedef-name can also be introduced by analias-declaration. The identifier following the using keyword becomes atypedef-name and the optional attribute-specifier-s原创 2017-01-17 14:19:22 · 7425 阅读 · 0 评论 -
C++11中bind的使用错误
写了一个非常简单的应用,如下:#include typedef struct__Data{ intd;}DataCB; template typenameT>class ICallBack{public: ICallBack(){} ~ICallBack(){}public:原创 2017-01-19 18:08:38 · 3027 阅读 · 0 评论
分享