C++ std::initializer_list std::initializer_list 是 C11 引入的语法糖与核心库设施的桥梁,它让统一初始化(Uniform Initialization)成为可能,理解其只读代理的本质和生命周期限制,是编写现代 C 库的关键。 一、核心本质 std::initializer_list 是 C++11 引入的轻量级模板类,用于表示同类型对象的数组视图。其主要目的是支持列表初始化语法(使用花括号 2026-05-24 C++ > 语言特性 > C++11 #C++ #模板 #C++11
C++ std::integral_constant 在模板元编程中的应用 一、模板元编程 模板元编程(Template Metaprogramming)是一种 C++ 编程技术,其主要手段是利用模板来实现在编译时执行计算。这种方法的优点是,通过在编译阶段完成部分工作,可以提高运行时的效率。 在模板元编程中,我们常常使用类型(type)来表示值(value),并通过模板特化或者模板函数的重载来实现不同的操作。 比如说,我们可以定义一个模板类 Factorial<3 2026-05-23 C++ > 模板 #C++ #模板
C++ constexpr、consteval、constinit 标准版本 特点 C++11 引入 constexpr 变量和函数;函数体限单条 return 语句 C++14 放宽 constexpr 函数限制:允许局部变量、多个 return、循环等 C++17 引入 if constexpr;constexpr static 成员变量可内联初始化;允许 constexpr Lambda C++20 允许 constexpr 虚函数 2026-05-22 C++ > 语言特性 > C++17 #C++ #C++11
C++ STL中的 iterator_traits 一、基本概念 iterator_traits 是 C++ 标准库中的一个模板类,位于 <iterator> 头文件中。它的主要作用是为迭代器提供统一的接口,允许算法以一致的方式访问迭代器的相关类型信息,而不用关心迭代器的具体类型。 在 STL 标准库提供的算法一般有以下特征: 参数一般包括 iterator 要根据 iterator 的种类,和 iterator 包装的元素的类型等 2026-05-21 C++ > 模板 #C++ #模板 #STL
C++标签派发(Tag Dispatching) 标签派发是在 C++ 20 引入 concept 之前模板编程的一个手段:由于 C++ 不支持函数模板的偏特化,所以为例实现偏特化而产生的一个技巧 一、引入 一般重载函数的设计是根据不同的参数决定具体做什么事情,编译器会根据参数匹配的原则确定正确的重载版本。但是对于函数模板,其参数类 型是泛化的模板参数,此时又如何让编译器选择我们希望的那个函数模板的实例呢? 提供特化版本是一个方法,但是如果 2026-05-20 C++ > 模板 #C++ #模板
C++ std::function 在现代 C++ 中,std::function(定义在 <functional> 头文件中)是一个通用的多态函数封装器,能够存储、复制和调用任何可调用对象 。你可以把它理解为一个“能够持有任何可调用对象”的容器。 在 std::function 出现之前,我们无法在一个容器或变量中存储不同类型的“可调用对象”。 普通函数指针只能存函数指针 Lambda 的类型在编译期是唯一的匿名类型 2026-05-19 C++ > 语言特性 > C++11 #C++ #C++11 #语言特性
C++ std::result_of和std::invoke_result 在 C++ 中,有时我们需要获取函数或可调用对象的返回值类型,以便进行后续的操作,在泛型编程中很常用,特别是当不同的参数集的结果类型不同时。 在早期的 C++ 版本中,我们需要手动推导函数返回值类型,这个过程非常复杂,也容易出错。为了解决这个问题,C11 引入了 std::result_of 和 std::result_of_t(C14),这两个模板可以方便地获取函数或可调用对象的返回值类型。而在 2026-05-18 C++ > 语言特性 > C++17 #C++ #C++11 #语言特性 #C++17
C++ 强制类型转换运算符 将类型名作为强制类型转换运算符的做法是 C 语言的老式做法,C++ 为保持兼容而予以保留。 C++ 引入了四种功能不同的强制类型转换运算符以进行强制类型转换:static_cast、reinterpret_cast、const_cast 和 dynamic_cast。 强制类型转换是有一定风险的,有的转换并不一定安全,如把整型数值转换成指针,把基类指针转换成派生类指针,把一种函数指针转换成另一种函 2026-05-17 C++ #C++
C++ decay/decltype/declval 一、decay 在 C++ 14 后,可使用别名 std::decay_t 在 C++ 中,Decay(退化)是指将一种类型转换为另一种更简单、更“原始”的类型的过程。这通常发生在将表达式传递给函数参数或进行模板推导时。 在 C++11 中,标准库提供了 std::decay(定义在 `` 头文件中) ,它精确地实现了上述规则。它是模板元编程中非常重要的工具。 Decay-copy(“衰变复 2026-05-17 C++ > 语言特性 > C++11 #C++ #模板 #C++11 #语言特性
C++ SFINAE机制 使用情景: 在 C++11 之前,SFINAE 是实现类型检查的唯一手段。例如,你想编写一个函数,它只接受数字类型,而不接受字符串或自定义类,这时就需要 SFINAE SFINAE(Substitution Failure Is Not An Error) 是 C++ 模板元编程的基石之一,字面意思是:“替换失败并非错误”。 简单来说,当编译器在模板实例化过程中,如果在替换模板参数时发生失败( 2026-05-17 C++ > 模板 #C++ #模板