Boost program options with default values always present when using vm.count()
Asked Answered
I

2

16

I've been trying to validate my passed options with boost::program_options. My command has several modes, each of which have associated params that can be specified. What I'm trying to do is ensure these associated params are passed with the mode, i.e.

unicorn --fly --magic-wings-threshold

Where --fly is the mode and --magic-wings-threshold is an associated param. What I've noticed is if --magic-wings-threshold has a default value, e.g.

("magic-wings-threshold,w", po::value<double>(&wings_thresh)->default_value(0.8, "0.8"),
           "Magic wings maximum power"
)

then I can't use

if (vm.count("magic-wings-threshold")( {
    // do stuff
}

to detect if the user passed that param.

It appears that default value params are always passed and detected in vm.count(). Does anyone know a workaround or alternative?

Iggy answered 8/2, 2012 at 20:6 Comment(1)
All the unicorns i'm familiar with do not fly and have no wings. Perhaps you were thinking of Pegasus?Truong
P
22

use boost::program_options::variable_value::defaulted()

if (vm["magic-wings-threshold"].defaulted())  {
    // assume defaulted value
} else {
    // one was provided
}
Puff answered 8/2, 2012 at 20:12 Comment(1)
I don't think this solution works, there is no way to tell the -k vs no -kCubature
C
0

If you want to tell difference between

-k option not provided
-k provided

You should use po::value()->implicit_value(), You can tell the different situations with:

-k option not provided  ->  vm["k"]==0  
-k option provided      ->  vm["k"]==1
Cubature answered 2/9, 2016 at 16:42 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.