boost program_options 开/关标志

Bar*_*rry 5 c++ boost boost-program-options

使用bool_switch,我可以编写一个命令行选项来打开一个标志:

bool flag;

po::options_description options;
options.add_options()
    ("on", po::bool_switch(&flag)->default_value(false))
    ;
Run Code Online (Sandbox Code Playgroud)

哪里现在./a.out将有flag==false./a.out --on将有flag==true。但是,对于被明确的目的,我会像另外添加一个命令行选项来把标志关闭。就像是:

options.add_options()
    ("on", po::bool_switch(&flag)->default_value(false))
    ("off", po::anti_bool_switch(&flag)) // ????
    ;
Run Code Online (Sandbox Code Playgroud)

有没有办法anti_bool_switch在 program_options 库中做,或者我基本上必须编写代理 bool 引用?

Bar*_*rry 5

我能想到的一件事(不确定这是否是最好的方法)是使用implicit_value()

po::typed_value<bool>* store_bool(bool* flag, bool store_as)
{
    return po::value(flag)->implicit_value(store_as)->zero_tokens();
}
Run Code Online (Sandbox Code Playgroud)

value必须使用所需的默认值进行初始化,否则这将满足所需的功能:

bool value = false;
options.add_options()
    ("on", store_bool(&value, true))
    ("off", store_bool(&value, false))
    ;
Run Code Online (Sandbox Code Playgroud)