: , var_map.count po:: notify, , this value_semantic, , , - program_options .
. ;
value-semantics :
po::options_description od;
od.add_options()
("mode1", po::bool_switch(&mode1)->notifier([&](bool b) { if (b && mode2) throw po::error{"Only one mode may be specified"}; }))
("mode2", po::bool_switch(&mode2)->notifier([&](bool b) { if (b && mode1) throw po::error{"Only one mode may be specified"}; }))
;
, :
if (!(mode1 || mode2))
throw po::error("Mode must be specified");
Live On Coliru
+ ./a.out
Mode must be specified
+ ./a.out --mode1
mode1: true mode2: false
+ ./a.out --mode2
mode1: false mode2: true
+ ./a.out --mode1 --mode2
Only one mode may be specified
+ ./a.out --mode2 --mode1
Only one mode may be specified
NXOR:
if (mode1 == mode2)
throw po::error("Exactly 1 of --mode1 and --mode2 must be specified");
Live On Coliru
, .
. Update: , () . , , .
: http://coliru.stacked-crooked.com/a/a7bd9072f3fa024e
enum class Mode {
mode1 = 1,
mode2 = 2
};
using mode_select = boost::optional<Mode>;
mode_select mode;
po::options_description od;
od.add_options()
("mode1", po::value<mode_select>(&mode)->implicit_value(Mode::mode1, ""))
("mode2", po::value<mode_select>(&mode)->implicit_value(Mode::mode2, ""))
;
, , ,