2015-10-16 36 views
3

使用bool_switch,我可以写一个命令行选项来打开一个国旗:升压program_options开/关标志

bool flag; 

po::options_description options; 
options.add_options() 
    ("on", po::bool_switch(&flag)->default_value(false)) 
    ; 

现在在哪里./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)) // ???? 
    ; 

有没有办法做到在program_options库anti_bool_switch,或者我基本上都写一个代理布尔参考?

回答

0

有一件事情我已经能够拿出(不知道这是最好的方法)是使用implicit_value()

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

value必须使用所需的缺省初始化,否则这满足所需功能:

bool value = false; 
options.add_options() 
    ("on", store_bool(&value, true)) 
    ("off", store_bool(&value, false)) 
    ; 
1

我不确定您的要求是否合理。如果用户输入“./a.out --on --off”,会发生什么?

否则,所有你需要的是确保你没有得到一个“无法识别的选项”消息,如果用户键入“./a.out --off”,你会得到你想要的行为。

bool flag; 
bool flag_off 

po::options_description options; 
options.add_options() 
    ("on", po::bool_switch(&flag)->default_value(false)) 
    ("off", po::bool_switch(&flag_off)->default_value(false)) ; 

... 

if(flag_on && flag_off) 
{ 
    cout << "nasty error" << endl; exit(1) 
}