33、C++ 函数对象、回调与单一定义规则详解

C++ 函数对象、回调与单一定义规则详解

1. 函数对象与回调

C++ 标准库的 STL 部分运用了函数对象(functors)的概念。所有算法都借助函数对象来定制其确切行为,其中许多函数对象被称作谓词(predicates)。谓词是返回布尔值(可转换为 bool 的值)的函数或函数对象。一般而言,谓词应当是纯函数对象,否则可能会产生意外结果。

C++ 标准库还提供了一些标准函数对象和用于组合的适配器。实际上,对于每个常见的一元和二元运算符,都有对应的函数对象。不过,标准库并未提供足够的适配器来支持将所有函数行为组合成函数对象。例如,无法将两个一元运算的结果组合成诸如 “this and that” 这样的准则。而 Boost C++ 库则提供了补充适配器,填补了这一空白。

2. 单一定义规则(One-Definition Rule,ODR)

单一定义规则是构建结构良好的 C++ 程序的基石。其最常见的结果易于记忆和应用:在所有文件中,非内联函数只能定义一次;在每个翻译单元中,类和内联函数最多定义一次,并且要确保同一实体的所有定义都相同。

2.1 翻译单元

在实际编写 C++ 程序时,我们会在文件中填充 “代码”。但在 ODR 的语境下,文件的边界并非至关重要,真正重要的是所谓的翻译单元。本质上,翻译单元是将文件输入编译器前,经过预处理器处理后的结果。预处理器会删除未被条件编译指令(如 #if #ifdef 等)选中的代码段,删除注释,递归插入 #included 文件,并展开宏。

例如,以下两个文件

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值