首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏光城(guangcity)

    现代C++之SFINAE

    介绍c++的SFINAE概念:类成员的编译时内省 0.导语1.C++自省? 2.2 SFINAE 回忆一下上述的重载决议: 函数调用 函数模板 SFINAE 我已经用几个段落的强大功能来戏弄你了,现在终于可以解释这个并不复杂的缩写词了。 SFINAE概念只是为“健全”的编译器保证这种“健全”的行为。 所有的表达式都不会导致SFINAE。一个广泛的规则是说功能/方法主体之外的所有替代都是“安全的”。 ,我建议您更多地搜索SFINAE技巧。 2.6 小结 以上C++98方式总结说出下面问题: SFINAE-14 3.C++11方式 SFINAE-14 在2000年的大世纪闰年之后,人们对未来几年相当乐观。

    3.6K20发布于 2020-02-13
  • 来自专栏光城(guangcity)

    C++那些事之SFINAE

    介绍c++的SFINAE概念:类成员的编译时内省 0.导语1.C++自省? 2.2 SFINAE 回忆一下上述的重载决议: 函数调用 函数模板 SFINAE 我已经用几个段落的强大功能来戏弄你了,现在终于可以解释这个并不复杂的缩写词了。 SFINAE概念只是为“健全”的编译器保证这种“健全”的行为。 所有的表达式都不会导致SFINAE。一个广泛的规则是说功能/方法主体之外的所有替代都是“安全的”。 ,我建议您更多地搜索SFINAE技巧。 2.6 小结 以上C++98方式总结说出下面问题: SFINAE-14 3.C++11方式 SFINAE-14 在2000年的大世纪闰年之后,人们对未来几年相当乐观。

    2.9K20编辑于 2022-06-20
  • 来自专栏技术随笔心得

    未来已来:从SFINAE到concepts

    SFINAE SFINAE 是 "Substitution Failure Is Not An Error" 的缩写。 概念提供了一种更加清晰和简洁的方法,用于规定模板类型参数必须满足的条件,以替代传统的通过模板特化和SFINAE(Substitution Failure Is Not An Error)技术实现的模板约束方式

    63210编辑于 2024-01-26
  • 来自专栏进击的程序猿

    C++奇淫巧技之SFINAE

    SFINAE 技术,即匹配失败不是错误,英文Substitution Failure Is Not An Error,其作用是当我们在进行模板特化的时候,会去选择那个正确的模板,避免失败 看个具体的例子 其作用主要是判断是否有no_destroy,并且在继承上也成立,但是继承在不同的gcc版本上不一定成立,具体可以看:http://stackoverflow.com/questions/1966362/sfinae-to-check-for-inherited-member-functions

    65130发布于 2018-08-23
  • 来自专栏光城(guangcity)

    现代C++之SFINAE应用(小工具编写)

    现代C++之SFINAE应用(小工具编写) 0.导语 现在考虑这个输入: map<int, int> mp{ {1, 1}, {2, 4}, {3, 9} 2.是否存在输出函数 使用SFINAE来检测是否可以直接输出: // 检测是否可以直接输出 template<typename T> struct has_output_function { template ,也就是第一个函数在std::declval<std::ostream &>() << *ptr会出错,但是在真正报错之前会去检测是否有重载函数,发现后面还有个output函数,最后决议不报错,这便是SFINAE 下面原理还是SFINAE来实现的,当不是pair的时候就调用第二个重载函数了,否则就是第一个。

    1.5K20发布于 2020-02-13
  • 请介绍下 C++ 模板中的 SFINAE?它的原则是什么?

    C++模板中的SFINAE一、SFINAE是什么?SFINAE(SubstitutionFailureIsNotAnError)是C++模板元编程中的一个重要概念,中文译为"替换失败并非错误"。 二、SFINAE的基本原则1.替换阶段vs实例化阶段展开代码语言:TXTAI代码解释模板参数推导过程:┌─────────────────────────────────────┐│1.模板参数替换(SFINAE 的注意事项1.SFINAE适用范围展开代码语言:C++AI代码解释//✅SFINAE适用:替换阶段template<typenameT>voidfunc(typenameT::value_type){} //如果T没有value_type,SFINAE生效//❌SFINAE不适用:实例化阶段template<typenameT>voidfunc(){typenameT::value_typex;//编译错误 的发展历程C++标准特性说明C++98/03SFINAE基础原始SFINAE机制C++11std::enable_if标准化的SFINAE工具C++14std::void_t简化SFINAE表达式C++

    11710编辑于 2026-02-24
  • 来自专栏后台公论

    C++设计模式之SFINAE:用来检测类中是否有某个成员函数

    C++中可以用SFINAE技巧达到这个目的。 SFINAE是Substitution Failure Is Not An Error的缩写,直译为:匹配失败不是错误。 在这个过程中,我发现有些常见的SFINAE写法是有问题的,下面探讨一下。 举个例子,我们来check一下C++标准库的类中有没有push_back()成员函数。 :endl; std::cout << has_push_back::test<std::vector<int> >(NULL) << std::endl; return 0; } SFINAE 因为网上能找到的各种SFINAE的实现版本中,很多对于push_back的检测都是有问题的。 而以上列举这两种,都能准确检测出string、vector、list中的push_back()。 下面列举一个常见但某些情况下会存在问题的SFINAE范本: class Base { }; class Drive:Base { public: void hello() {} }; template

    5.8K20编辑于 2021-12-20
  • 来自专栏C++ 动态新闻推送

    C++ 中文周刊 第104期

    ✓ ✓ std::copy_n N/A N/A ✓ UB UB ✓ std::copy_backward N/A N/A ✓ ✓ UB ✓ cstring memcpy ✓ UB ✓ UB UB SFINAE memmove ✓ UB ✓ ✓ ✓ SFINAE Qt q_uninitialized_relocate_n ✓ ✓ ✓? UB UB SFINAE q_relocate_overlap_n ✓ ✓ ✓ ✓ ✓ SFINAE BSL destructiveMove ✓ ✓ ✓ UB UB SFINAE P2786R0 trivially_relocate ✓ SFINAE SFINAE ✓ ✓ SFINAE relocate ✓ ✓ SFINAE ✓ ✓ SFINAE move_and_destroy ✓ ✓ SFINAE UB ?

    59030编辑于 2023-03-11
  • 来自专栏C++ 动态新闻推送

    C++ 中文周刊 2024-01-26 第147期

    ✓ ✓ std::copy_n N/A N/A ✓ UB UB ✓ std::copy_backward N/A N/A ✓ ✓ UB ✓ cstring memcpy ✓ UB ✓ UB UB SFINAE memmove ✓ UB ✓ ✓ ✓ SFINAE Qt q_uninitialized_relocate_n ✓ ✓ ✓? UB UB SFINAE q_relocate_overlap_n ✓ ✓ ✓ ✓ ✓ SFINAE BSL destructiveMove ✓ ✓ ✓ UB UB SFINAE P2786R0 trivially_relocate ✓ SFINAE SFINAE ✓ ✓ SFINAE relocate ✓ ✓ SFINAE ✓ ✓ SFINAE move_and_destroy ✓ ✓ SFINAE UB ?

    30110编辑于 2024-07-30
  • 大家说 C++17 没啥新意,if constexpr 却让我眼前一亮

    替代 SFINAE:代码更直观、写法更简洁,如一致的函数体中表达多分支逻辑。 与 SFINAE 不同,分支逻辑发生在函数体内部,不依赖重载解决。 六、已有实现对比 技术 可读性 编译时间 生成代码体积 语义约束情况 SFINAE/tag-dispatch 差 慢 大 灵活但复杂 if constexpr ⭐⭐⭐⭐⭐ 较快 小 条件需 constexpr Concepts + requires (C++20) ⭐⭐⭐⭐⭐⭐⭐₊ 最快 最小 条件可表达更丰富 与 SFINAE 相比,if constexpr 使逻辑更直接,代码更简洁([medium.com 相较 SFINAE 它语法清晰、逻辑直观,易于维护;未来可与 Concepts 结合使用,进一步提升表达力和可读性。

    50710编辑于 2025-06-30
  • 来自专栏学西

    【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧

    第七章: 模板匹配规则与SFINAE 7.1 模板匹配规则 C++编译器在调用模板时,会根据传入的模板参数进行匹配。模板匹配的规则比较复杂,涉及到多个优先级和模板特化。 (Substitution Failure Is Not An Error) SFINAE 是 C++ 模板系统中的一个重要规则,全称为 “Substitution Failure Is Not An SFINAE 是指在模板实例化过程中,如果某些模板参数的替换失败,编译器不会直接报错,而是选择其他可行的模板。 示例:SFINAE 规则 template<typename T> typename std::enable_if<std::is_integral<T>::value, T>::type CheckType 写在最后 通过对C++模板进阶技术的深入讲解,我们探索了非类型模板参数、模板特化、SFINAE以及模板元编程等高级概念,这些工具不仅使我们的代码更加灵活高效,还为我们提供了在复杂场景下优化代码的思路。

    64610编辑于 2024-10-09
  • 来自专栏HappenLee的技术杂谈

    C++雾中风景18:C++20, 从concept开始

    image.png 群里的一个问题 SFINAE 熟悉C++模板编程的小伙伴肯定第一时间想到通过SFINAE的方式来解决,让笔者来解决这个问题的话,会写出下面的代码: template <typename 而很多时候我们使用它需要 要进行模板推断类型的编程设计 利用SFINAE的方式来类型约束 这无形之中增加Coding时的心智成本,而concept作为一个新的语法糖,给了我们拆分二者的机会:让上帝归上帝

    1.3K00编辑于 2022-03-12
  • 来自专栏HappenLee的技术杂谈

    C++雾中风景18:C++20, 从concept开始

    群里的一个问题 SFINAE 熟悉C++模板编程的小伙伴肯定第一时间想到通过SFINAE的方式来解决,让笔者来解决这个问题的话,会写出下面的代码: template <typename T> T test 而很多时候我们使用它需要 要进行模板推断类型的编程设计 利用SFINAE的方式来类型约束 这无形之中增加Coding时的心智成本,而concept作为一个新的语法糖,给了我们拆分二者的机会:让上帝归上帝

    77330编辑于 2022-03-23
  • 来自专栏高性能服务器开发

    C++17一个很冷门很有意思的新特性

    >using void_t = void; 看着它很简单,但它搭配SFINAE却可以在模板元编程中发挥巨大作用。 vector<double>> << '\n'; // 1 std::cout << is_iterable<double> << '\n'; // 0} 它的原理其实就是利用SFINAE

    94510编辑于 2022-07-01
  • 来自专栏10km的专栏

    C++11模版元编程:如何判断一个类型是完整类型(complete type)

    所以判断T是否为完整类型的模板函数就可以写成如下的样子: // 根据SFINAE原则,sizeof(T)不能正确计算就进入此分支,value为false; template <typename T, typename

    1.7K30发布于 2020-04-30
  • 来自专栏Toddler的笔记

    C++20 New Features

    concept SignedIntegral = std::is_integral_v<T> && std::is_signed_v<T>; template <SignedIntegral T> // no SFINAE Reduces the code duplication and SFINAE. explicit(!

    81610发布于 2020-05-20
  • 来自专栏10km的专栏

    C++11:如何判断一个类是另一个模板类的子类?

    确实是有效的,但是只是在gcc(我用的是5.2.0版本)编译器下有效, 但在VS2015下编译是不能通过的,VS2015虽然几乎支持了所有C++11的特性,但还有两三个特性没有支持,这其中就包括”表达式 SFINAE

    3.3K10发布于 2019-05-25
  • 现代C++零基础到工程实战

    SFINAE 技术与类型特性(std::enable_if/std::is_same)。并发模型演进:任务并行库(TBB)、协程(C++20 coroutines)。 SFINAE 技术:根据类型特性选择重载函数。5. 跨平台与可移植性编译器差异处理:兼容 GCC/Clang/MSVC 的扩展语法。系统 API 封装:抽象操作系统接口(如文件、网络)。

    43810编辑于 2025-11-06
  • 来自专栏AIoT技术交流、分享

    你经历过哪些优秀的C++面试?

    对 std::enable_if、SFINAE (Substitution Failure Is Not An Error) 等高级模板技术的掌握。 深入问题:请实现一个基于模板元编程的类型推导系统,能够在编译期推导出一个函数返回的类型,并结合 SFINAE 做出函数的选择。 5、性能优化与代码设计 问题:给定一段代码,分析其性能瓶颈。

    1.1K10编辑于 2024-12-06
  • 来自专栏C++语法及相关算法详解

    抽象之诗:C++模板的灵魂与边界

    模板匹配规则与SFINAE 8.1 模板匹配规则 C++编译器在调用模板时,会根据传入的模板参数进行匹配。模板匹配的规则比较复杂,涉及到多个优先级和模板特化。 double x = 1.1, y = 2.2; std::cout << Add(x, y) << std::endl; // 调用模板实例化版本 return 0; } 8.2 SFINAE (Substitution Failure Is Not An Error) SFINAE是 C++ 模板系统中的一个重要规则,全称为 “Substitution Failure Is Not An SFINAE 是指在模板实例化过程中,如果某些模板参数的替换失败,编译器不会直接报错,而是选择其他可行的模板。 // 整数类型,输出20 std::cout << CheckType(3.14) << std::endl; // 浮点数类型,输出1.57 return 0; } 在这个例子中,SFINAE

    20010编辑于 2025-11-05
领券