CLI11 是一个现代的 C++ 命令行解析库,提供了简洁的 API 来定义和解析命令行参数。
在 CLI11 中, add_option 有两种常见的使用方式,它们的区别主要体现在参数的传递和返回值的处理上。以下是两种方式的对比:
方式 1:直接绑定变量
cpp
应用代码
cpp
cli11.add_option("-o, --output", output, "Specify the output file"); 特点:
- 直接绑定变量:
output是一个预先定义的变量(例如std::string output),CLI11会将用户输入的值直接存储到这个变量中。- 适用于单值选项(用户只能输入一个值)。
- 返回值忽略:
- 这种调用方式通常不需要保存返回值,因为值会直接存储到绑定的变量中。
- 简单易用:
- 适合简单的单值选项,代码更简洁。
适用场景:
- 选项只需要一个值(如输出文件名
-o)。 - 不需要对选项值进行额外的处理或验证。
方式 2:保存返回值并设置多值策略
cpp
应用代码
cpp
linkDirsOpt = cli11.add_option("-L, --link-dir", "Specify one directory where to link modules")->multi_option_policy(CLI::MultiOptionPolicy::TakeAll); 特点:
- 保存返回值:
linkDirsOpt是一个CLI::Option*类型的指针,指向add_option返回的选项对象。- 通过返回值可以进一步配置选项的行为(如多值策略)。
- 支持多值:
- 通过
multi_option_policy(CLI::MultiOptionPolicy::TakeAll)设置多值策略,允许多次使用该选项(如-L dir1 -L dir2),并将所有值收集到一个列表中。 - 适用于需要多个值的选项。
- 通过
- 灵活性高:
- 可以通过返回值对选项进行更复杂的配置(如验证、回调等)。
适用场景:
- 选项需要支持多个值(如链接目录
-L)。 - 需要对选项值进行额外的处理或验证。
总结对比
| 特性 | 方式 1:直接绑定变量 | 方式 2:保存返回值并设置多值策略 |
|---|---|---|
| 绑定变量 | 直接绑定到预先定义的变量(如 output )。 | 不直接绑定变量,通过返回值操作选项对象。 |
| 多值支持 | 仅支持单值。 | 支持多值(通过 multi_option_policy 配置)。 |
| 返回值处理 | 通常忽略返回值。 | 保存返回值( CLI::Option* ),用于进一步配置。 |
| 适用场景 | 简单的单值选项(如 -o )。 | 复杂的多值选项或需要额外配置的选项(如 -L )。 |
示例说明
方式 1 的典型用法
cpp
应用代码
cpp
std::string output;
cli11.add_option("-o, --output", output, "Specify the output file"); - 用户输入
-o file.txt后,output的值会被设置为"file.txt"。
方式 2 的典型用法
cpp
应用代码
cpp
CLI::Option* linkDirsOpt;
linkDirsOpt = cli11.add_option("-L, --link-dir", "Specify one directory where to link modules")->multi_option_policy(CLI::MultiOptionPolicy::TakeAll); - 用户输入
-L dir1 -L dir2后,linkDirsOpt会收集所有值({"dir1", "dir2"})。
选择建议
- 如果选项只需要一个值且不需要额外配置,使用 方式 1(直接绑定变量)。
- 如果选项需要支持多个值或需要进一步配置,使用 方式 2(保存返回值并设置多值策略)。