SFINAE是Substitution Failure Is Not An Error的缩写,即利用编译器的模板匹配失败来实现某些功能。C++中模板匹配遵循尽可能精确的原则,当最精确的模板匹配失败时会再尝试候选模板,因此利用同名但模板参数不同的多个模板函数可以达到编译器检查或判断的目的。 比如,对于多个module_xx类,需要检查其是否存在get_name函数,以采用不同的处理。 假设两个类
原创
2012-11-06 18:33:54
7103阅读
介绍c++的SFINAE概念:类成员的编译时内省0.导语1.C++自省?2.老式的C++98方式2.1重载决议2.2 SFINAE2.3 sizeof运算符2.4 结合一切2.5 实现我...
原创
2021-08-03 09:50:12
375阅读
原创 lightcity 光城 2020-01-07收录于话题#C++那些事53个介绍c++的SFINAE概念:类成员的编译时内省0.导语1.C++自省?2.老式的C++98方式2.1重载决议2.2 SFINAE2.3 sizeof运算符2.4 结合一切2.5 实现我们的想法2.6 小结3.C++11方式3.1 decltype, declval, auto & co4.融合时间4.1 第
转载
2021-03-16 12:47:06
605阅读
介绍c++的SFINAE概念:类成员的编译时内省0.导语1.C++自省?2.老式的C++98方式2.1重载决议2.2 SFINAE2.3 sizeof运算符2.4 结合一切2.5 实现我们的想法2.6
原创
2022-05-29 00:43:03
320阅读
https://eli.thegreenplace.net/2014/sfinae-and-enable_i
翻译
2023-05-23 13:22:46
139阅读
体会这一个例子,检查是否是一个类:P187
转载
2017-03-01 12:23:00
85阅读
2评论
现代C++之SFINAE应用(小工具编写)0.导语现在考虑这个输入:map<int, int> mp{ {1, 1}, {2, 4}, ...
原创
2021-08-03 09:06:11
193阅读
原创 lightcity 光城 2020-01-09收录于话题#C++那些事53个现代C++之SFINAE应用(小工具编写)0.导语现在考虑这个输入:map<int, int> mp{ {1, 1}, {2, 4}, {3, 9}};cout << mp << endl;vector<vector<int&g
转载
2021-03-16 12:47:44
349阅读
8.4 SFINAE (Substitution Failure Is Not An Error) 8.4 SFINAE(替换失败并不是错误) In C++ it is pretty common to overload functions to account for various argume
转载
2020-05-16 17:26:00
196阅读
2评论
8.5 Compile-Time if8.5 编译期if Partial specialization, SFINAE, and std::enable_if allow us to enable or disable templates as a whole. C++17 additionally
转载
2020-05-16 17:29:00
106阅读
2评论
在C++20之前,模板元编程主要依赖于SFINAE(Substitution Failure Is Not An Error)和traits类来实现类型检查和约束,这种方式虽
std::enable_if的使用对于重载的函数或者函数模板的选择上,编译器内部有一个自己的规则,并不是简单粗暴的对函数就优先选择,对函数模板就靠后选择替换失败并不是一个错误(SFINAE):Substitution Failure Is Not An Error,SFINAE看成是C++语言的一种特性或者说一种模板设计中要遵循的重要原则针对函数模板而言,当用一个具体类型替换函数模板的参数时,可能
enable_if SFINAE 是 substitution failure is not an error 的缩写,即匹配失败不是错误。就是说,匹配重载的函数 / 类时如果匹配后会引发编译错误,这个函数 / 类就不会作为候选。这是一个 C++11 的新特性,也是 enable_if 最核心的原理 ...
转载
2021-09-12 21:37:00
356阅读
2评论
一、前言:模板编程的力量模板是 C++ 的核心特性之一,它为语言带来了强大的泛型编程能力。在现代软件工程中,高性能、高复用性、类型安全是三大目标,而模板正是实现这一目标的关键工具。从简单的函数模板、类模板,到复杂的模板偏特化、模板元编程(Template Metaprogramming)、SFINAE、type traits,再到 C++20 引入的 concepts 约束机制,C++ 模板编程体
模板里的一个特殊概念——替换失败非错(substitution failure is not an error),英文简称为 SFINAE。函数模板的重载决议我们之前已经讨论了不少模板特化。我们今天来着重看一个函数模板的情况。当一个函数名称和某个函数模板名称匹配时,重载决议过程大致如下:根据名称找出所有适用的函数和函数模板对于适用的函数模板,要根据实际情况对模板形参进行替换;替换过程中如果发生错误
一、前言:为什么要学习模板编程?C++ 是一门兼具面向对象与泛型编程能力的语言。模板是 C++ 泛型编程的核心机制,使得代码能够在类型无关的前提下进行复用和抽象。掌握模板不仅可以写出更强大、可拓展的程序,还能深入理解 STL、Boost 等优秀库的设计原理。本篇文章将深入剖析 C++ 模板编程,从最基础的函数模板到模板特化、变参模板、SFINAE、类型萃取和 CRTP(奇异递归模板模式)等高级技巧
C++ 模板编程(Template Programming)是现代 C++ 的核心技术之一,它使得程序具有更高的泛型能力、可复用性和类型安全性。模板的核心思想是:编写与类型无关的通用代码,编译器在实际使用时根据具体类型生成代码。本文将从模板的基本概念出发,逐步深入函数模板、类模板、模板特化、模板元编程(TMP)、SFINAE 和 std::enable_if 等内容,帮助你构建起完整的 C++ 模
核心主题:C++高级特性 - 深入现代C++编程今日学习目标:理解模板元编程的基本概念和编译期计算。掌握变参模板的使用方法和场景。理解SFINAE(替换失败不是错误)原理和应用。掌握C++20概念(Concepts)的基本用法。了解折叠表达式和完美转发。学习如何编写类型安全的泛型代码。详细内容1. 模板元编程基础模板元编程是指在编译期执行的计算,利用模板特化、递归实例化等机制在编译期完成计算。代码
在C++ 20之前,我们在编写泛型代码时,模板参数的约束往往通过复杂的SFINAE(Substitution Failure Is Not An Error)策略或繁琐的Traits类来实现。这不仅难以阅读,也非常容易出错,导致很多程序员在提及泛型编程时,总是心有余悸、脊背发凉。
在没有引入Concepts之前,我们只能依靠经验和技巧来解读编译器给出的错误信息,很容易陷入“类型迷路”。这就好比在没有GPS导航的年代,我们依靠复杂的地图和模糊的方向指示去一个陌生的地点,很容易迷路。而Concepts的引入,就像是给C++的模板系统安装了一个GPS导航仪,让编译器和程序员都能清晰地理解类型要求,从而高效地进行泛型编程。
原创
精选
2024-10-20 11:05:25
424阅读