C++模板之SFINAE技术

别再纠结了!手把手教你根据网站场景选SSL证书(Let‘s Encrypt vs TrustAsia实战对比) 本文深度解析Let's Encrypt与TrustAsia两大主流SSL证书的优缺点,提供场景化选择指南。从兼容性、有效期、域名覆盖等维度对比,帮助开发者根据网站用户群体(特别是中国用户)和自动化需求做出最优选择,并附有宝塔面板和腾讯云的具体配置教程。 阅读详情


今天在阅读muduo库的源码时,里面有这样几行代码:

template<typename T>
struct has_no_destroy
{
  template <typename C> static char test(typeof(&C::no_destroy)); // or decltype in C++11
  template <typename C> static int32_t test(...);
  const static bool value = sizeof(test<T>(0)) == 1;
};

有一个模板类的成员函数调用了它:

static void init()
  {
    value_ = new T();   //直接调用构造函数
    if (!detail::has_no_destroy<T>::value)   //保证支持销毁方法才会注册atexit
    {
      ::atexit(destroy);   //登记atexit时调用的销毁函数,防止内存泄漏
    }
  }

看起来很不明白为什么。然后搜集资料,学习到了C++模板除了萃取的又一个新技术,SFINAE技术,即匹配失败不是错误。

SFINAE的意思是这样的,假如有一个特化会导致编译时错误(即出现编译失败),只要还有别的选择可以被选择,那么就无视这个特化错误而去选择另外的可选选择。

举例:在上面这个示例中,如果我们给传的参数T类型为POD类型,当调用detail::has_no_destroy<T>::value时,T参数会在has_no_destroy类中实例化模板,由于是POD类型,不具备no_destroy方法,不可以使用&C::no_destroy方式调用,意味这如果匹配这个会导致编译错误,那么它会寻找下一个去实例化。不过因为test(...)的存在,任何不匹配上一个的到这里都会被接收,所以我们声明出来的成员变量test会是int32_t类型,而不是char类型。则下一行的value,由于测量test零初始化的字节数,相当于sizeof(int32_t) != 1,所以value的值被确定为false。

我们退出这个函数,回到调用处。if(!detail::has_no_destroy<T>::value)此时if语句不成立,所以不用注册atexit时的destroy函数。我们是以POD类型举例的,POD类型不正好不需要destroy吗?完美。


下面是一个例子,同样验证了SFINAE技术:

#include <iostream>
using namespace std;

template <typename T>
struct has_typedef_foobar {
    typedef char yes[1];
    typedef char no[2];

    template <typename C>
    static yes& test(typename C::foobar*);

    template <typename C>
    static no& test(...);

    static const bool value = sizeof(test<T>(nullptr)) == sizeof(yes);
};

struct foo {
    typedef float foobar;
};

int main()
{
    cout<<std::boolalpha;
    cout<<has_typedef_foobar<int>::value<<endl;    //false
    cout<<has_typedef_foobar<foo>::value<<endl;    //true

    return 0;
}

所以可以说,SFINAE技术也可以用来检测某个参数是否有某个方法。



参考:https://en.m.wikipedia.org/wiki/Substitution_failure_is_not_an_error

  http://www.360doc.com/content/13/0509/17/9200790_284185572.shtml




SFINAE 模板与泛型编程之SFINAE 阅读详情

相关推荐

20、SFINAE 技术与概念模拟:C++ 模板约束的实现与应用

本文深入探讨了C++中SFINAE技术与C++20概念在模板参数约束中的应用。详细介绍了SFINAE的原理及其在无C++20支持环境下模拟概念的方法,包括类型特征的实现、宏的使用和约束的构建。通过实际示例展示了如何利用SFINAE实现类似概念的编译时检查,并对比了SFINAE与C++20概念在语法、功能和可维护性方面的差异。最后给出了在不同C++版本中选择合适技术的决策建议,帮助开发者提升代码的健壮性和可读性。

day7的博客 111

跟我学c++高级篇——模板元编程之六SFINAE

SFINAE,对于想在模板编程中有更深的想法时,建议还是要认真学习。其实SFINAE更像是模板编程中更进阶的一种用法,虽然它可能在复杂的应用情况有些晦涩难懂,但既然决定想搞c++的模板编程,一些精深的东西还是需要去学习的。特别之于模板的元编程,更是如此。虽然有了concepts,但看以前的代码还是需要懂得这个技术的。

fpcc的专栏 4768

SFINAE技术与C++模板元编程

本文探讨了C++中的SFINAE技术及其在模板元编程中的应用。通过实例解析了SFINAE的工作原理,展示了如何通过重载解析和模板参数替换来实现对类型特性的检测。文章详细解释了静态断言、条件编译以及如何利用SFINAE排除不符合条件的重载函数。...

weixin_30021053的博客 313

C++ 萃取技术——使用SFINAE特性的信息萃取

SFINAE(Substitution Failure Is Not An Error,替换失败并不是一个错误)是实现类型萃取中一个重要的技巧,它允许编译器在模板实例化过程中忽略那些会导致错误的替换,而不是产生编译错误。

慢慢记录,慢慢更新。 1468

探索C++模板元编程与SFINAE技术

本文深入探讨了C++模板元编程中的一些高级技术,特别是SFINAE(替换失败不是错误)技术的应用。通过分析具体的代码示例,展示了如何利用模板和SFINAE实现编译时特性检测、函数重载解析和优化,以及解决库更新兼容性问题。...

weixin_35756624的博客 453

SAP MTO实战:从销售订单到生产订单的精准触发与配置详解

本文深入解析SAP系统中按订单生产(MTO)模式的核心流程与配置。详细阐述了如何通过精准配置物料主数据策略组、需求类型及计划策略(如策略50),实现从销售订单自动触发生产订单的完整链路。文章结合实战案例,指导用户打通销售与生产环节,并提供了关键事务代码与常见问题排查指南,助力企业实现以销定产,优化库存与成本控制。

weixin_29300931的博客 215

C++ 模板简介(一)—— SFINAE

SFINAE, 类型检查, Concepts ​ SFINAE 机制是组成 C++ 模板机制及类型安全的相当重要的基础。全称是 Substitution failure is not an error。大概的意思就是只要找到了可用的原型(比如函数模板、类模板等)就不会编译错误。SFINAE 可以被用来进行模式匹配。在尝试本篇代码时请打开 C++17。 https://en.cppreference...

とある黄鱼のOIブログ 1700

ADS重新安装失败排查指南:从注册表清理到环境变量配置

本文详细解析了ADS重新安装失败的常见原因及解决方案,包括注册表残留清理、license路径锁定处理和环境变量配置。通过分步指南和实用技巧,帮助工程师高效解决安装问题,确保软件正常运行。

weixin_42524708的博客 456

SFINAE 是技術債:C++20 Concepts 如何讓你的模板程式碼減少 80%

C++20 Concepts如何替代SFINAE优化模板编程 本文探讨了C++模板编程从SFINAE到Concepts的演进。SFINAE作为传统模板元编程技术,虽然功能强大但存在代码臃肿、可读性差和维护困难等问题,形成了沉重的技术债务。C++20引入的Concepts特性通过明确指定模板参数约束条件,显著改善了这些问题。 对比分析显示,使用Concepts可以: 减少约80%的模板约束代码 大幅提升代码可读性 生成更友好的编译错误信息 降低维护成本和学习曲线 文章提供了从SFINAE迁移到Concepts

王同学的博客 850

半导体制造中的通孔缺陷与冗余通孔技术解析

通孔(Via)是半导体制造中连接不同金属层的关键结构,其可靠性直接影响芯片良率。随着工艺节点演进至28nm及更先进制程,通孔缺陷导致的良率损失日益显著,主要表现为完全开路和高阻态两种失效模式。冗余通孔技术通过在关键位置增加备用连接,可有效提升芯片可靠性,其实现涉及物理冗余与电气冗余两种方案。该技术在7nm/5nm工艺中已证明可将通孔相关缺陷率降低10-100倍,但面临设计规则复杂性、规模处理效率和动态合规验证等工业化挑战。智能双切通孔插入流程通过动态DRC规则解析、奇偶层级并行处理和增量式验证等创新方法,显

weixin_35982453的博客 383

【实战】S7-PLCSIM Advanced V3.0 授权问题排查指南(Error Code:-30与LicenseNotFound深度解析)

本文深度解析S7-PLCSIM Advanced V3.0启动时遇到的Error Code:-30与LicenseNotFound报错问题。文章提供了一套系统性的排查指南,从检查WinPcap驱动兼容性、确保Automation License Manager服务运行,到正确安装浮动授权以及清理系统残留缓存,逐步解决授权链条中的各个环节故障,帮助用户彻底解决仿真环境启动失败的问题。

weixin_29185167的博客 721

C++模板编程实战记录:SFINAE核心技术深度掌握

本文记录了作者在2025年10月13日进行的C++模板编程实战学习过程。通过4小时的系统练习,作者从函数模板基础开始,逐步掌握类模板、模板特化到SFINAE等核心技术。实战中详细记录了开发环境(VSCode+g++)、遇到的典型错误(如函数模板误写为类模板、类型推导冲突、const正确性问题)及解决方法,并最终实现了编译期类型检测功能。文章采用"问题-解决"的递进式结构,包含代码示例、错误分析和运行结果,展现了从基础到高级的完整模板编程学习路径。

2301_76657443的博客 733

Win11/Win10系统下,Proe5.0 M280终极版保姆级安装与激活指南(含SSQ补丁避坑)

本文提供Win11/Win10系统下Pro/E 5.0 M280终极版的详细安装与激活指南,涵盖环境配置、SSQ补丁应用及常见问题解决方案。通过系统调整、分步安装和性能优化,确保软件在现代操作系统上的稳定运行,特别适合机械设计用户参考。

weixin_30895059的博客 444

C++模板进阶:从类型推导到SFINAE,掌握编译期编程核心技术

C++模板作为泛型编程的核心机制,通过类型参数化实现了代码的高度复用。其原理在于编译器在编译期间根据具体类型生成特化代码,从而在保证类型安全的同时消除运行时开销。这一技术价值在于能够实现零开销抽象,是高性能库和框架的基础。在应用场景上,模板广泛用于容器、算法、类型萃取和编译期计算等领域。本文聚焦于C++模板的进阶应用,深入解析了**模板特化**与**SFINAE**等关键技术,这些机制使得开发者能够设计出更灵活、更高效的泛型组件,是深入理解STL实现和构建高质量基础设施库的必备知识。

weixin_30430169的博客 393

ALSA音频开发实战:如何用snd_pcm_avail避免缓冲区溢出(附完整代码)

本文深入探讨了在ALSA音频开发中,如何利用`snd_pcm_avail`函数有效管理环形缓冲区,从而避免音频数据溢出或下溢。通过实战代码示例,详细解析了该函数在播放场景下的核心作用,即实时查询可写入的帧数,并构建了自适应写入循环以实现稳健的流量控制,确保音频流的平滑与稳定。

weixin_29183637的博客 461

LLC型自驱动半桥谐振变换器:电压电流变化与自然换向解析

变换器的工作状态经历了多个阶段,从模态一的关断状态,到模态二和三的电流供电状态,每个阶段都得到了合理的设计和优化。的工作原理,尤其是在半个周期内的电压和电流变化。上图 展示了该变换器在工作时的电压和电流波形,它为我们揭示了变换器如何通过精确的电流和电压控制,优化性能并实现高效能转换。,并根据负载情况调整电流和电压的工作模式,能够极大提升变换器的效率,尤其是在零电压开通和自然换向的设计中,发挥着关键作用。这意味着,电流会随着时间周期的变化,呈现典型的振荡波形,从而达到良好的电流控制。是两个关键的电流变量。

weixin_43199439的博客 279

C++模板编译期推导与SFINAE技术深度解析

C++模板元编程通过编译期类型推导实现零成本抽象,是高性能计算的核心技术。其核心机制包括模板实例化三阶段处理、类型特征检查以及SFINAE(替换失败非错误)原则,这些特性使得开发者能在编译阶段完成类型安全检查和逻辑优化。现代C++标准引入的if constexpr和concepts进一步简化了元编程复杂度,特别适用于图像处理、游戏引擎等需要极致性能的场景。通过将运行时决策转为编译期确定,不仅能提升40%以上的执行效率,还能提前暴露类型错误,显著降低调试成本。

weixin_30512965的博客 56

Android NDK/JNI面试题大全及参考答案(3万字长文)

是一套工具集合,它允许开发者为Android平台编写原生应用程序或者应用程序的部分模块。NDK 主要用于开发那些需要高性能计算的应用程序,例如游戏引擎、图像处理软件或音频/视频编码解码器等。通过使用 C 或 C++ 编写代码,开发者可以利用硬件加速功能,提高应用性能。NDK 提供了一系列工具来帮助开发者完成从源代码到可执行文件的整个过程,包括编译、链接、调试等功能。

大模型大数据攻城狮的专栏 1257

C++类型萃取技术:从模板特化到SFINAE的编译期编程实战

在C++泛型编程中,模板特化是构建灵活、可复用代码的基础技术,它允许为特定类型或类型类别提供定制化实现。其核心原理在于编译器在编译期通过模式匹配选择最匹配的模板版本,从而实现静态多态。这一机制的技术价值在于能够编写出高度通用且性能优异的库代码,避免了运行时开销。在标准模板库(STL)的实现中,模板特化被广泛应用于迭代器特性(iterator_traits)和类型特性(type_traits)等组件,使得算法能够根据迭代器类别或类型属性选择最优实现路径。通过SFINAE(替换失败并非错误)和`std::ena

weixin_34392435的博客 307

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C++模板编程中的SFINAE技术详解

SFINAE(Substitution Failure Is Not An Error)是C++模板元编程中的核心机制,它允许编译器在模板参数替换失败时优雅地移除候选函数而非报错。这种技术通过类型萃取、表达式检测等方式实现编译期多态,为泛型编程提供了精细控制能力。结合现代C++的enable_if、void_t等工具,开发者可以构建类型安全的泛型接口,广泛应用于序列化库、智能指针等场景。随着C++20概念的引入,虽然部分场景可以被替代,但理解SFINAE仍是处理遗留代码和复杂模板约束的必备技能。

weixin_29560063的博客 301

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C++模板元编程:SFINAE技术详解与应用实践

模板元编程是C++中实现编译期计算的核心技术,其中SFINAE(替换失败非错误)机制是模板特化与重载决议的关键基础。该技术通过编译器在模板参数替换失败时的特殊处理逻辑,使得开发者能够实现类型特征检测、条件化编译等高级功能。在工程实践中,SFINAE广泛应用于接口约束检查、编译期多态实现等场景,配合C++11引入的decltype、std::enable_if等特性,大幅提升了模板代码的健壮性。随着C++17的constexpr if和C++20概念的引入,现代SFINAE技术呈现出更简洁的实现方式,但理解其

weixin_34005090的博客 250

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C++模板进阶:从特化到SFINAE,掌握编译期编程核心技术

模板是C++泛型编程的核心机制,它通过在编译期生成类型安全的代码,实现了零开销抽象。其工作原理基于两阶段编译:首先检查模板定义语法,然后在实例化时进行完整类型检查。这种机制赋予了C++强大的静态多态能力,能够构建高度可复用且性能优异的组件库。在工程实践中,模板进阶技术如特化、偏特化、SFINAE和可变参数模板,使得开发者能够设计出更灵活、更安全的泛型代码,广泛应用于标准库容器、算法以及元编程等场景。本文深入解析了模板参数、编译实例化机制以及SFINAE等核心概念,帮助读者从“会用模板”进阶到“精通模板设计”

weixin_30899023的博客 332

C++类型萃取技术:从模板特化到SFINAE的编译期编程实践

在C++泛型编程中,模板提供了强大的代码复用能力,但其类型擦除特性使得在编译期无法直接获取类型的内部属性。类型萃取技术通过模板特化和SFINAE机制,在编译期对类型进行“审问”,获取其内在属性信息,如是否为指针、是否可平凡拷贝等。这项技术的核心价值在于实现零开销抽象,让编译器根据类型特性选择最优代码路径,从而提升运行时效率。在工程实践中,类型萃取广泛应用于STL迭代器系统、算法优化和编译期接口约束等场景。例如,通过`std::iterator_traits`和`std::is_trivially_copya

weixin_31220401的博客 261

现代C++模板与泛型编程_第5章_萃取技术与策略技术_基于SFINAE特性的信息萃取

class A {};class Bpublic:// 泛化版本// 特化版本public:// T()判断是否可以构造,如果可以构造,返回true_type类型// 否则,根据SFINAE规则,丢弃这个版本,调用接收任意参数的版本// 接收任意参数的版本// 定义一个value值,根据test函数的返回类型来决定// test(nullptr) 调用的是 test(void*)版本// decltype(test(nullptr)) 获取到函数的返回值类型。

weixin_43916755的博客 848
上一篇: muduo库的BlockingQueue和BoundBlockingQueue类剖析
下一篇: muduo库的Singleton类剖析
FreeeLinux
博客等级 码龄11年 421粉丝 356原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值