get_option: C++ 配置文件解析,一文从入门到精通

引言 几乎每个非平凡的程序都需要配置参数:输入文件路径、算法阈值、输出格式、模型参数……硬编码这些值会让程序失去灵活性,而手写解析逻辑又繁琐且容易出错。 getoption 是 utilsxx 库中的轻量级配置解析组件。它采用声明式设计理念:你先声明程序需要哪些参数、哪些是必填的、哪些参数属于互斥组,然后从文件或字符串向量中读取配置,getoption 会自动完成解析、校验和类型转换。本文将带你从基础用法到高阶技巧,彻底掌握这个工具。 一、设计理念:声明式配置管理 传统的配置解析往往是"命令式"的:读一行、判断键名、手动转换类型、检查是否缺失。getoption 将其转变为"声明式": // 1. 声明:我的程序需要这些参数 getoption gopt; gopt.add_options({"range", "interval", "output"}, {true, true, false}); // 2. 读取:从配置文件加载 gopt.read_options("config.txt"); // 3. 校验:自动检查必填项和互斥组 gopt.check_mandatory(); // 4. 使用:直接获取已转换类型的值 auto range = gopt.get_value<std::string>("range"); auto weight = gopt.get_values<double>("weight", '|', '/'); 这种设计的优势: 集中管理:所有参数定义在一处,一目了然 自动校验:必填项、互斥组自动检查,无需手写 if 判断 类型安全:模板函数自动完成字符串到目标类型的转换 别名支持:一个参数可以有多个名称(如 model-file/ModelFile/model_file) 二、快速上手 2.1 配置文件格式 getoption 使用简洁的 key-value 格式: # 以 # 开头的行是注释,会被自动跳过 range = 100/1000/200/2000/full_range interval = 10/10 weight = 120.12/232/114.2 model-file = test.txt # 空行也会被跳过,不影响解析 # 同一个 key 可以出现多次,值会自动合并 model-tag = model1 model-tag = model2 model-tag = model3 out-model = example.msh 格式规则: ...

May 10, 2026 · 张壹

toml11: C++ TOML 解析完全指南

引言 在程序配置领域,TOML(Tom’s Obvious, Minimal Language)凭借其直观的语法和强类型特性,逐渐成为 JSON 和 YAML 的有力替代者。与 JSON 相比,TOML 支持注释、更易于手写;与 YAML 相比,TOML 语法更严格、歧义更少。 toml11 是一个现代 C++17 的 TOML 解析库,以header-only、类型安全、异常友好著称。utilsxx 将其作为外部组件集成到 lib/toml.hpp 中,方便项目直接使用。本文将基于 toml11 的完整功能,结合 utilsxx 中的示例,带你彻底掌握 TOML 在 C++ 中的读写技巧。 一、TOML 速览 1.1 为什么选择 TOML? 特性 TOML JSON YAML 注释支持 ✅ ❌ ✅ 强类型 ✅ ✅ ❌(隐式转换多) 手写友好 ✅ ⚠️ ⚠️(缩进敏感) 日期时间 ✅ 原生 ❌ ✅ 表(Table) ✅ ❌(用对象模拟) ✅ 歧义性 低 低 高 1.2 TOML 核心语法 # 这是注释 # 键值对(基本类型) title = "TOML Example" enabled = true port = 8080 pi = 3.14159 # 表(类似 JSON 的对象) [owner] name = "Tom Preston-Werner" dob = 1979-05-27T07:32:00-08:00 # 嵌套表 [servers.alpha] ip = "10.0.0.1" role = "frontend" # 数组 ports = [8000, 8001, 8002] # 表数组(数组的每个元素是一个表) [[products]] name = "Hammer" sku = 738594937 [[products]] name = "Nail" sku = 284758393 二、快速上手 2.1 解析 TOML 文件 #include "toml.hpp" #include <iostream> int main() { // 解析文件 const auto root = toml::parse("config.toml"); // 获取值 std::string title = toml::find<std::string>(root, "title"); std::cout << "Title: " << title << std::endl; return 0; } 2.2 两种访问方式 toml11 提供两种访问风格: ...

May 10, 2026 · 张壹