这是一个轻量级的c++选项解析器库,支持标准的GNU风格的选项语法。
如果您已经使用了版本2,那么在版本3(尚未发布的当前主版本)中有一些您应该知道的突破性更改。如果您是cxxopts的新手,您可以跳过此部分。 解析器不再修改它的参数,因此您可以传递const argc和argv,并期望它们不会被更改。 解析器对象不再依赖于解析器。因此,它可以从解析器之外的作用域返回,并且仍然工作。既然没有修改输入,ParseResult就存储了一个不匹配的参数列表。这些检索如下:
auto result = options.parse(argc, argv); result.unmatched(); // get the unmatched arguments这是一个轻量级的c++选项解析器库,支持标准的GNU风格的选项语法。 可供选择的方案如下:
--long --long=argument --long argument -a -ab -abc argumentc有一个论点,而a和b没有。 此外,——之后的任何内容都将解析为位置参数。
创建一个cxxopt::Options实例
cxxopts::Options options("MyProgram", "One line description of MyProgram");使用add_options
options.add_options() ("d,debug", "Enable debugging") // a bool parameter ("i,integer", "Int param", cxxopts::value<int>()) ("f,file", "File name", cxxopts::value<std::string>()) ("v,verbose", "Verbose output", cxxopts::value<bool>()->default_value("false")) ;选项用一个长选项和一个可选的短选项声明。必须提供描述。第三个参数是值,如果省略它就是布尔值。任何类型都可以通过运算符>>给出,只要它可以被解析。 要解析命令行,请做:
auto result = options.parse(argc, argv);要检索一个选项,请使用result.count(“option”)来获取它出现的次数
result["opt"].as<type>()得到它的值。如果“opt”不存在,或者不是正确的类型,那么将抛出异常。 注意options.parse的结果应该被使用,只要创建options对象在作用域内.
您可以允许跳过未识别的参数。这既适用于未解析为另一个选项的位置参数,也适用于与指定的参数不匹配的——参数。这可以通过调用:
options.allow_unrecognised_options();在结果对象中,它们被检索:
result.unmatched()异常情况抛出c++异常。有两种类型的异常:定义选项的错误和解析参数列表时的错误。所有异常都派生自cxxopts::OptionException。定义选项的错误来自cxxopts::OptionSpecException,解析参数的错误来自cxxopts::OptionParseException。 所有异常都定义了what()函数来获取解释错误的可打印字符串。
为了显示帮助消息,可以将选项放入组中。要在组中放置选项,请将组作为字符串传递给add_options。然后,在显示帮助时,将希望作为向量显示的组传递到帮助函数。
位置参数可以被可选地解析为一个或多个选项。要设置位置参数,请调用
options.parse_positional({"first", "second", "last"})其中“last”应该是具有容器类型的选项的名称,其他选项应该只有一个值。
选项可以使用默认值或隐式值声明,也可以同时使用两者。 默认值是当选项没有在命令行上指定时所接受的值。下面指定了一个选项的默认值:
cxxopts::value<std::string>()->default_value("value")隐式值是在命令行上不带参数地给出选项时所接受的值。下面指定了一个隐式值:
cxxopts::value<std::string>()->implicit_value("implicit")如果一个选项两者都有,那么不指定它就会给出值“value”,在命令行上写入——option会给出值“implicit”,写入——option=another会给出值“another”。 注意,默认值和隐式值始终存储为字符串,而不管您希望将其存储在哪种类型中。它将被解析,就像它是在命令行上给出的一样。
布尔选项有一个默认的隐式值“true”,它可以被覆盖。其效果是,单独写入-o将把选项o设置为true。但是,它们也可以用各种字符串编写,使用=value。没有办法消除位置参数与布尔值后面的值之间的歧义,因此我们选择它们为位置参数,因此-o false不起作用。
也支持以std::vector<T>的形式解析值列表,只要T可以解析。要分离列表中的单个值,使用定义CXXOPTS_VECTOR_DELIMITER,默认情况下为’,’。确保在值之间没有使用空格,因为它们会被解释为下一个命令行选项。可以解析为std::vector<double>的命令行选项示例:
--my_list=1,-2.1,3,4.5同一个选项可以用不同的参数指定多次,这些参数都将按照出现的顺序记录。一个例子:
--use train --use bus --use ferry这是通过使用价值向量的选项支持:
options.add_options() ("use", "Usable means of transport", cxxopts::value<std::vector<std::string>>())帮助的第一行中程序名后面的字符串可以被调用options.custom_help完全替换。注意,您可能还想通过调用options.positional_help来覆盖位置帮助。
只需要包含头文件
唯一的构建要求是一个c++编译器,支持c++ 11个特性,如:
正则表达式常量表达式默认构造函数 GCC >= 4.9 or clang >= 3.1 with libc++ are known to work.