只有当它们具有 value_semantic 时,才能将通知器用于已解析的选项。给定通知程序自动处理无值选项的最佳方式是什么?
简单的方法是使用隐式赋值创建一个虚拟 value_semantic,因此用户可以传递没有值的选项。这导致了显式提供值的可能性。如果提供了值,可以添加运行时检查并引发错误。
更新:但是,这在位置选项存在的情况下不起作用,因为位置选项的值可以跟随无值选项引发异常作为给定值。
只有当它们具有 value_semantic 时,才能将通知器用于已解析的选项。给定通知程序自动处理无值选项的最佳方式是什么?
简单的方法是使用隐式赋值创建一个虚拟 value_semantic,因此用户可以传递没有值的选项。这导致了显式提供值的可能性。如果提供了值,可以添加运行时检查并引发错误。
更新:但是,这在位置选项存在的情况下不起作用,因为位置选项的值可以跟随无值选项引发异常作为给定值。
俄罗斯程序员论坛上的一个人 OXPEHOMETP 给了我一些使用建议boost::program_options::bool_switch()
。
当通过 value-permitted 接口定义一个没有值的选项时,必须不是boost::program_options::typed_value()
作为语义传递,而是bool_switch()
. 这意味着不能从命令行显式为此选项获取任何值。可以在http://www.boost.org/doc/libs/release/doc/html/boost/program_options/bool_switch.html找到有关它的信息
这是提供标志作为补充当前答案的选项的完整示例:
#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;
}
我的 qmake pro 文件(我使用 Qt 5.4):
TEMPLATE = app
CONFIG += console
CONFIG += c++14
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += main.cpp
include(deployment.pri)
qtcAddDeployment()
INCLUDEPATH += /opt/boost_1_57_0
unix:!macx: LIBS += -L/opt/boost_1_57_0/stage/lib -lboost_program_options
在没有任何选项的情况下运行程序会导致:
./untitled4
overwrite is: false
但是使用 '-o' 选项/标志运行会给出:
./untitled4 -o
overwrite is: true
使用zero_tokens
修饰符。似乎您还需要使用implicit_value
,但是选项名称之后提供的任何内容都不会被选项解析器使用。相反,当在命令行上注意到该选项时,会为该选项分配隐式值,从而触发该选项的通知程序(因此请确保提供通知程序功能)。显然,选项的值类型为string
. 我不清楚为什么。
void got_foo(std::string const&);
desc.add_options()
("foo",
po::value<std::string>()
->implicit_value("")
->zero_tokens()
->notifier(&got_foo),
"foo description")
;