Skip to content

CLI11 是一个现代的 C++ 命令行解析库,提供了简洁的 API 来定义和解析命令行参数。

在 CLI11 中, add_option 有两种常见的使用方式,它们的区别主要体现在参数的传递和返回值的处理上。以下是两种方式的对比:

方式 1:直接绑定变量

cpp

应用代码

cpp
cli11.add_option("-o, --output", output, "Specify the output file");

特点:

  1. 直接绑定变量
    • output 是一个预先定义的变量(例如 std::string output ), CLI11 会将用户输入的值直接存储到这个变量中。
    • 适用于单值选项(用户只能输入一个值)。
  2. 返回值忽略
    • 这种调用方式通常不需要保存返回值,因为值会直接存储到绑定的变量中。
  3. 简单易用
    • 适合简单的单值选项,代码更简洁。

适用场景:

  • 选项只需要一个值(如输出文件名 -o )。
  • 不需要对选项值进行额外的处理或验证。

方式 2:保存返回值并设置多值策略

cpp

应用代码

cpp
linkDirsOpt = cli11.add_option("-L, --link-dir", "Specify one directory where to link modules")->multi_option_policy(CLI::MultiOptionPolicy::TakeAll);

特点:

  1. 保存返回值
    • linkDirsOpt 是一个 CLI::Option* 类型的指针,指向 add_option 返回的选项对象。
    • 通过返回值可以进一步配置选项的行为(如多值策略)。
  2. 支持多值
    • 通过 multi_option_policy(CLI::MultiOptionPolicy::TakeAll) 设置多值策略,允许多次使用该选项(如 -L dir1 -L dir2 ),并将所有值收集到一个列表中。
    • 适用于需要多个值的选项。
  3. 灵活性高
    • 可以通过返回值对选项进行更复杂的配置(如验证、回调等)。

适用场景:

  • 选项需要支持多个值(如链接目录 -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(保存返回值并设置多值策略)。

基于 VitePress 构建