C++ boost程序选项:通知没有值的选项
只有当解析的选项具有值\u语义时,才能使用通知程序。 由给定的通知程序自动处理无值选项的最佳方式是什么 简单的方法是使用隐式赋值生成一个伪值,这样用户就可以在没有值的情况下传递选项。 这导致了显式提供值的可能性。 如果提供了值,可以添加运行时检查并抛出错误 更新:C++ boost程序选项:通知没有值的选项,c++,boost-program-options,C++,Boost Program Options,只有当解析的选项具有值\u语义时,才能使用通知程序。 由给定的通知程序自动处理无值选项的最佳方式是什么 简单的方法是使用隐式赋值生成一个伪值,这样用户就可以在没有值的情况下传递选项。 这导致了显式提供值的可能性。 如果提供了值,可以添加运行时检查并抛出错误 更新: 但是,这在存在位置选项的情况下不起作用,因为位置选项的值可以跟在无值选项后面,将异常作为其给定值引发。使用zero\u标记修饰符。您似乎还需要使用隐式_值,但是选项名称后面提供的任何内容都不会被选项解析器使用。相反,当在命令行上注意到
但是,这在存在位置选项的情况下不起作用,因为位置选项的值可以跟在无值选项后面,将异常作为其给定值引发。使用
zero\u标记
修饰符。您似乎还需要使用隐式_值
,但是选项名称后面提供的任何内容都不会被选项解析器使用。相反,当在命令行上注意到该选项时,将为该选项指定隐式值,从而触发该选项的通知程序(因此请确保提供通知程序功能)。显然,选项的值类型为string
也很重要。我不清楚为什么
void got_foo(std::string const&);
desc.add_options()
("foo",
po::value<std::string>()
->implicit_value("")
->zero_tokens()
->notifier(&got_foo),
"foo description")
;
void got_foo(std::string const&);
说明添加选项()
(“富”,
po::value()
->隐式_值(“”)
->零辅币()
->通知程序(&got_foo),
“foo描述”)
;
俄罗斯程序员论坛上的一个家伙OXPEHOMETP给了我一些建议,建议我使用boost::program\u options::bool\u switch()
当通过允许值的接口定义没有值的选项时,必须将非boost::program_options::typed_value()
作为语义传递,而是bool_switch()
。这意味着不能从命令行显式获取此选项的值。
您可以在上找到有关它的信息。这是一个完整的示例,说明如何提供一个标志作为补充当前答案的选项:
#include <iostream>
#include <boost/program_options.hpp>
using namespace std;
namespace po = boost::program_options;
int main(int ac, char* av[])
{
po::options_description desc("Allowed options");
desc.add_options()
("help", "produce help message")
("overwrite,o", po::bool_switch()->default_value(false),
"enable file overwrite");
po::variables_map vm;
po::store(po::parse_command_line(ac, av, desc), vm);
boolalpha(cout); // display true and false for bool
cout << "overwrite is: " << vm["overwrite"].as<bool>() << endl;
return 0;
}
在没有任何选项的情况下运行程序会导致:
./untitled4
overwrite is: false
但是,使用“-o”选项/标志运行时会给出:
./untitled4 -o
overwrite is: true
是的,这是我最初的方法。但是,如果在传递的键之后有一个位置选项,那么它必须由got_foo正确填充。这很棘手而且不干净,基于一些技术问题在不同的选项之间产生了不必要的关系。我不明白。当我在测试命令行上通过
--foo
之后的非选项时,其值不会存储在foo
的选项值中。foo
选项获取值”
,因为它的隐式值就是这个值。您误解了implicit\u value()
选项,它只在没有提供值的情况下工作,但是一些值跟随它使用的键,而不是隐式值。所以,下一个传递的位置选项的值将用作非值选项的值。查看:my\u程序-使用位置选项(无值)键(值)
。这里的位置选项\u值
将被视为键,在隐式\u值()
中带有\u no\u值
的传递值方法使用bool\u开关的示例:(“normalize\u regularizer,n”,po::bool\u开关()->默认值(false),“normalize regularization常量”)
,我发现boost.po文档中没有包含它。非常感谢。如果不明显,程序选项的bool_开关()和value()一样,可以选择使用一个指向变量的指针来保存该值(bool_开关()的类型为bool),因此假设例如bool clobber代码>预先声明您可以有(“覆盖,o”,po::bool_开关(&clobber)->默认值(false),“启用文件覆盖”)代码>
./untitled4 -o
overwrite is: true