一、什么是面向控制标记编程(CMOP)
面向控制标记编程,是一种以'控制标记'作为行为调度核心的 C++ 编程范式。
它的核心思想非常清晰:
- 把函数的行为、策略、模式、选项抽象成独立的'标记类型'(空结构体/带参结构体)
- 通过函数重载 + 类型匹配实现不同行为的分发
- 核心逻辑与控制逻辑彻底分离
- 扩展新行为时不修改原有代码、不增加冗余分支、不破坏接口稳定
简单一句话总结: 让标记决定行为,让重载实现行为,让核心逻辑只做核心事。
CMOP 不是新语法,而是对 C++ 两大基础能力的高级组合:
- 结构体/类作为类型标记(空结构体也能作为合法参数)
- 函数重载根据参数类型自动匹配调用
它属于静态派发、编译期绑定、零运行时开销的范式,非常适合底层库、工具类、接口层、状态控制层等场景。
二、CMOP 的核心设计原则
一个规范的 CMOP 实现,通常遵循以下几条原则:
1. 标记类型化
不用 bool、int、enum 等弱类型表示控制选项,而是用独立结构体表示每一种控制行为,让每个标记具备唯一类型身份。
2. 重载驱动行为
不同标记对应不同重载函数,编译器自动匹配,无 if/else、无 switch、无运行时判断。
3. 核心与控制分离
函数只负责核心业务(写文件、发请求、计算、打印),控制逻辑(重试、延迟、覆盖、追加、单次执行)全部交给标记。
4. 扩展开放、修改关闭(符合开闭原则)
新增一种行为只需要:
- 新增一个标记结构体
- 新增一个对应重载函数
完全不改动原有代码,不会引入 Bug,也不会破坏兼容性。
5. 语义直观、自解释
标记名称就是行为含义,例如:
once:只执行一次append:追加模式overwrite:覆盖模式silent:静默模式delay<N>:延迟执行
调用方一眼看懂,无需文档、无需注释。
三、CMOP 的两种经典标记类型
CMOP 把标记分为两大类,结构清晰、易于统一规范。
1. 无参控制标记
空结构体,不携带数据,仅表示行为模式。
示例:
namespace marker {
struct once {};
struct append {};
struct overwrite {};
struct silent {};
}

