Boost-program-options:无值选项的通知器

boost-program-options: notifier for options with no value

本文关键字:通知 选项 Boost-program-options      更新时间:2023-10-16

只有当已解析的选项具有value_semantic时,才能使用通知器。由给定的通知器自动处理无值选项的最佳方法是什么?

简单的方法是使用隐式赋值创建一个虚拟的value_semantic,这样用户就可以不带值地传递选项。这导致了显式提供值的可能性。如果提供了该值,可以添加运行时检查并抛出错误。

更新:但是,这在存在位置选项的情况下不起作用,因为位置选项的值可以跟随无值选项引发异常,因为它的给定值

俄罗斯程序员论坛上的一个家伙OXPEHOMETP给了我一个使用boost::program_options::bool_switch()的建议。

当通过有值允许的接口定义一个没有值的选项时,必须传递bool_switch()而不是boost::program_options::typed_value()作为语义。这意味着不能从命令行显式地为该选项获取任何值。可以在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文件(我使用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")
;