首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏技术随笔心得

    惯用法之CRTP

    wikipedia给出了CRTP的一般形式,如下: // The Curiously Recurring Template Pattern (CRTP) template <class T> class 既然有CRTP,那么其必然有自己存在的道理。那么CRTP都用在什么场景呢? 静态多态 其实,在前面的例子中,已经大致了解了使用crtp技术来实现多态功能,该种实现方式为静态多态,是在编译期实现的。 局限性 既然CRTP能实现多态性,且其性能优于virtual,那么virtual还有没有存在的必要么? 虽然CRTP最终还是调用派生类中的成员函数。 // virtual Base *v1 = new Derived; Base *v2 = new Derived1; 正是因为基于CRTP方式的指针具有不同的类型,所以不能将CRTP基类指针存储在容器中 结语 通过CRTP技术,在某种程度上也可以实现多态功能,但其也仅限定于使用场景,正如局限性一节中所提到的,CRTP是一种特殊类型的多态性,在少数情况下可以替代动态多态性的需要;另外,使用CRTP技术,代码可读性降低

    1.3K20编辑于 2022-08-25
  • 来自专栏技术随笔心得

    CRTP避坑实践

    在上一篇文章<<惯用法之CRTP>>(如果不了解什么是CRTP,请先阅读该篇文章)一文中,介绍了CRTP的基本原理。今天借助本文,总结下在开发过程中,使用CRTP遇到的坑。 容器存储 CRTP技术因为其性能优越,实现简单,在工程应用中非常广泛。实际上,相对于普通的虚函数,其具有一定的局限性。问题在于Base类实际上是一个模板类,而不是一个实际的类。 :11 #125 0x00000000004006c4 in Base<Derived>::PrintType (this=0x7fffffffe38f) at crtp.cc:11 #126 ) at crtp.cc:11 从上述gdb的分析结果看出,重复执行crtp.cc中第11,即递归调用t.PrintType()。 手滑笔误 CRTP可以带来性能上的好处,但前提是我们写的代码真的遵守了那个规范。要是我们因为笔误写错了代码了呢?

    1.1K30编辑于 2022-08-25
  • 来自专栏程序员的园——原创文章

    浅析C++中的CRTP

    基本思想 CRTP利用模板元编程的特性,通过模板继承的方式实现递归结构。 通过CRTP,我们可以在基类中调用派生类的方法,而不需要使用虚函数的运行时开销。 的应用场景 CRTP通常用于需要在编译期解决多态性问题的情况下,以提高代码性能和灵活性。 实现优化的数据结构:CRTP可以用于实现优化的数据结构,例如静态多叉树、静态链表等,以提高性能和内存利用率。 结论 CRTP是一种强大的C++编程技巧,通过模板元编程实现了静态多态性和灵活性。 在实际项目中,我们可以将CRTP应用于各种场景,从而提高代码的性能和可维护性。

    73500编辑于 2025-02-18
  • 来自专栏HappenLee的技术杂谈

    C++雾中风景14:CRTP, 模板的黑魔法

    1.初见 First of All, 我们先瞅瞅CRTP长啥样。 1.2:CRTP的使用 我们重点来看看,这个CRTP在上文的enable_shared_from_this之中起到了怎么样的作用。从1.1的代码之中我们可以看到。 而通过CRTP,恰恰就能通过静态多态的方式,规避上述问题。 通过这种CRTP的巧妙方式降低了上面提到的虚函数开销。 4.参考资料 维基百科:CRTP ClickHouse源码 Doris源码

    1.9K32发布于 2020-07-13
  • 来自专栏光城(guangcity)

    C++多态性能测试:CRTP vs std::variant vs virtual

    C++多态性能测试:CRTP vs std::variant vs virtual 多态是面向对象编程的一个重要概念,它使得单一接口能够代表不同的类型。 CRTP(Curiously Recurring Template Pattern):CRTP是一种比较特殊的技术,它通过模板的奇特递归模式实现多态性。 测试的组合场景如下: 单纯crtp crtp + std::variant virtual std::variant + std::visit std::variant + std::get_if std 测试结果1:gcc编译,可以看到virtual与std::variant性能差别不大,但是与crtp差别非常大。 测试结果2:clang编译,总体趋势类似gcc编译,只有crtp + std::variant性能明显回退,这个可能也是由于这里用了std::visit导致。

    93310编辑于 2024-01-12
  • 来自专栏landv

    烽火2640路由器命令行手册-08-服务质量配置命令

    show queueing {custom | priority} 参数 无 缺省 无 命令模式 授权命令模式 使用说明 无 相关命令 无 第2章   CRTP配置命令 本章介绍CRTP命令。 2.1  CRTP配置命令 CRTP配置命令包括: l   debug ip rtp header-compression l   ip rtp compression-connections l   passive 在接收到对端的CRTP报文后开始发送CRTP报文。 缺省值 在未配置该命令的情况下为禁止状态。配置该命令时在不加可选参数的情况下默认为iphc-format。 Rcvd: total 在该端口上收到的CRTP报文总数。 compressed 压缩的CRTP报文总数。 Errors 收到的错误报文总数。 dropped 收到的报文被直接删除的总数。 Sent: total 发送的CRTP报文总数。 compressed 发送的压缩CRTP报文总数。 bytes saved 节约的字节数。 bytes sent 实际发送的字节数。

    1K20发布于 2018-12-17
  • 来自专栏光城(guangcity)

    编程轻松炫技:不费吹灰之力打印100个数字,面试考点应有尽有

    今天来给大家用一些C++的骚操作来写出这种代码,欢迎留言与转发~ 这道题目其实非常简单,但却涵盖了很多面试考点,其中包括: 模版特化、便特化,如何编写递归模版 CRTP std::copy、std::iota JustPrint<100> { JustPrint<100>() { std::cout << 1 << " "; } }; int main() { JustPrint<1> j; } 3.CRTP 方式3基于方式2,将其改造为crtp编程风格,是不是有点看不懂了,嘿嘿。

    36410编辑于 2024-01-10
  • 来自专栏Kindem的博客

    醒醒吧,静态多态根本没有这么香

    CRTP CRTP 全称 Curiously Recurring Template Pattern,即奇异递归模板模式,是一种经典的 C++ 设计模式,听起来很反人类,我们先来看一段代码: #include char* argv[]) { Child1 child1; Child2 child2; Print(child1); Print(child2); } 这是一个 CRTP

    95710编辑于 2022-08-12
  • 来自专栏C++ 模板编程:从基础到现代实战

    模板编程高级技巧与实战

    一、 CRTP(奇异递归模板模式)1.1 静态多态与代码复用核心思想:通过模板参数将派生类类型传递给基类,利用编译时多态替代运行时虚函数调用。这种技术能减少内存占用(无需虚函数表)并提升执行效率。 void OnDraw() override { // Windows API 绘制按钮的具体实现 MessageBox(nullptr, L"Button Draw", L"CRTP CRTP实现方式通过编译时绑定消除这些开销。 Button : public IControl {public: void Paint(HWND hWnd) override { // GDI+绘制逻辑... }};// CRTP elapsed.count() << " ms\n";初始测试结果:Serialization time: 123.45 ms五、更进一步:模板元编程优化方案5.1 核心优化思路静态多态替代动态多态:使用CRTP

    71920编辑于 2025-02-20
  • 来自专栏C++核心准则原文翻译

    C++核心准则C.146:如果无法避免在继承层次中移动,使用dynamic_cast

    ., you are using CRTP carefully), and there is no virtual inheritance involved, consider tactically resorting 存在非常罕见的情况,如果你已经判定dynamic_cast的影响是确实存在的,你可以使用其他的方式静态保证向下转换会成功(例如,你小心地使用了CRTP),而且不涉及到虚继承的话,可以考虑战术上采用带有明显注释的 CRTP:静态分发。 具体请参照: https://eli.thegreenplace.net/2013/12/05/the-cost-of-dynamic-virtual-calls-vs-static-crtp-dispatch-in-c

    90310发布于 2020-03-25
  • 来自专栏C++ 动态新闻推送

    C++ 动态新闻推送 第17期

    constant expression assert(42 == g(i)); } https://godbolt.org/z/rjeodeMoP Using C++20’s concepts as a CRTP 用concept来实现CRTP模式,遇到了很多阻碍,如果有Unified Function Call Syntax , UFCS说不定能解决,当前不推荐,可以当做一个拓展眼界的思路看一看 一篇文章带你读懂

    59620发布于 2021-08-31
  • 来自专栏C++技术干货

    从C++ 14到C++ 17:理解聚合初始化是如何工作的

    structBase{private:Base(){};friendDerived;};structDerived:Base<Derived>{};intmain(){Derivedd{};}这段代码是跟CRTP (CuriouslyRecurringTemplatePattern)相关的经典技巧,避免把错误的类传递给CRTP基类。

    15500编辑于 2025-12-29
  • 来自专栏GiantPandaCV

    【从零开始学深度学习编译器】十八,MLIR中的Interfaces

    Dialect Interface可以通过继承一个CRTP基类DialectInterfaceBase::Base<>来进行定义。 CRTP的介绍可以参考:https://zh.wikipedia.org/wiki/奇异递归模板模式,我理解静态多态(CRTP)是因为MLIR里面会存在很多Dialect Interface要从这个DialectInterfaceBase ::Base<>基类派生出来,为了性能考虑用CRTP比较合适。 这些Interface是通过覆盖特定 IR 实体的 CRTP 类来定义的;分别是 AttrInterface、OpInterface 或 TypeInterface。

    2.4K20编辑于 2022-02-11
  • 来自专栏Java冰冻三尺

    为什么 Java 中“1000==1000”为false,而”100==100“为true?

    英文原文:http://dwz.date/crTP 这是一个挺有意思的讨论话题,大家可以,动手实操一下。 为什么 Java 中“1000==1000”为false,而”100==100“为true?

    87640发布于 2020-09-10
  • 来自专栏编程学习基地

    经典永不过时!重温设计模式

    CRTP -The curiously recurring template pattern CRTP (奇异递归模板模式)是一种在编译期实现多态方法,是对运行时多态一种优化,多态是个很好的特性,但是动态绑定比较慢 而使用 CRTP,完全消除了动态绑定,降低了继承带来的虚函数表查询开销。 CRTP包含: 从模板类继承, 使用派生类本身作为基类的模板参数。‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 这样做的目的是在基类中使用派生类。 每种编程语言都会有一些独特特殊习惯用法,Java的MVC,Golang的对象池模式(Object Pool)等,文中列举的C++一些常见的惯用法RAII,Policy-based Design ,Pimpl,CRTP

    1.4K40发布于 2021-04-21
  • 来自专栏C++

    C++23新特性:显式对象形参与显式对象成员函数

    这为实现一些复杂的模板模式,如Curiously Recurring Template Pattern(CRTP),提供了更简洁的语法。

    43610编辑于 2025-04-10
  • 来自专栏C++ 动态新闻推送

    C++ 中文周刊 第83期

    cppblog/cpp20-coroutine-improvements-in-visual-studio-2019-version-16-11/ Static, Dynamic Polymorphism, CRTP and C++20’s Concepts 用concept实现crtp

    66120编辑于 2022-10-27
  • 来自专栏程序员

    C++模板元编程从入门到精通

    类型安全的多态:CRTP模式通过模板继承实现静态多态,避免虚函数运行时开销。 示例:CRTP实现Shape多态// 基类模板template <typename Derived>struct Shape { void draw() const { static_cast

    53810编辑于 2025-07-28
  • 来自专栏c语言与cpp编程

    C++模版的本质

    STL还结合CRTP (Curiously recurring template pattern)等模板技术,实现类似动态多态(虚函数)的静态多态,减少运行开销。 5. Andrei Alexandrescu 提出的Policy-Based Class Design;以及Jim Coplien的curiously recurring template pattern (CRTP 模板细节: wikipedia.org, cppreference.com(C++,模板template, Template metaprogramming, CRTP (Curiously recurring

    2.1K30发布于 2021-03-25
  • 来自专栏homura的博客

    LLVM Pass 其零:新的Pass机制

    那么我们来看一下PassInfoMixin的声明部分,实际上利用CRTP的机制来获取PassInfoMixin的子类信息并且返回,同样做到了多态的效果 include/llvm/IR/PassManager.h /// A CRTP mix-in to automatically provide informational APIs needed for /// passes. /// /// This provides

    2.6K40编辑于 2023-04-07
领券