boost :: program_options中的default_value和implicit_value有什么区别?

时间:2010-05-13 19:47:52

标签: boost boost-program-options

这就是问题所在。为什么我会使用implicit_value而不是default_value,反之亦然?

谢谢!

3 个答案:

答案 0 :(得分:38)

如果用户未指定其他值,

default_value()是将放在variables_map中的值:

./a.out             # implies width=75 if that's the default_value for width
./a.out --width=80  # default_value not used

implicit_value()是用户指定选项但没有相邻值时将使用的值。

./a.out --width     # implies width=75 if that's the implicit_value for width
./a.out --width=80  # implicit value not used

如果使用implicit_value,那么在命令行选项的短选项中,用户必须在选项后立即指定值:

./a.out -w80   # implicit_value not used
./a.out -w 80  # wrong: 80 parsed as extra arg if implicit_value is defined

答案 1 :(得分:0)

如果我没记错的话,差异就出现在一个允许-X=Y之类的选项上(例如,“Y”可能是一个数字)。如果用户未在命令行中输入-X,则会获得默认值。如果用户在命令行上输入-X而未指定值,则会获得隐式值。

例如,考虑gcc,它支持从0到3(IIRC)的优化级别。如果您根本没有指定-O,则默认为-O0(即,关闭优化)。如果指定-O(没有数字),则会得到隐含值,相当于-O1。您也可以明确指定-O1,也可以指定-O2-O3

答案 2 :(得分:0)

这里是example

    desc.add_options()
        ("help", "produce help message")
        ("optimization", po::value<int>(&opt)->default_value(10), 
              "optimization level")
        ("verbose,v", po::value<int>()->implicit_value(1),
              "enable verbosity (optionally specify level)")
        ("listen,l", po::value<int>(&portnum)->implicit_value(1001)
              ->default_value(0,"no"),
              "listen on a port.")
        ("include-path,I", po::value< vector<string> >(), 
              "include path")
        ("input-file", po::value< vector<string> >(), "input file")
    ;

如果您既不输入优化也不收听,则

./ myApp.exe

输出:

 Optimization level is 10
 Listen port is 0

如果您输入的选项--optimization不带参数,则会丢失参数。而且,如果您输入的--listen不带参数,它将给出一个隐式值1001。