boost-program-options:没有值的选项的通知程序

Rig*_*iga 24 c++ boost-program-options

只有在具有value_semantic的情况下,才能将通知程序用于解析选项.给定通知程序自动处理无值选项的最佳方法是什么?

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

更新:但是,这在位置选项存在的情况下不起作用,因为位置选项的值可以遵循无值选项,将异常作为给定值给出它.

Rig*_*iga 40

俄罗斯程序员论坛上的一个人OXPEHOMETP给了我一些建议boost::program_options::bool_switch().

通过允许值的接口定义没有值的选项时,必须不boost::program_options::typed_value()作为语义传递,但是bool_switch().这意味着无法从命令行为此选项显式获取任何值.可以在http://www.boost.org/doc/libs/release/doc/html/boost/program_options/bool_switch.html找到相关信息.

  • bool_switch的示例用法:```("normalize_regularizer,n",po :: bool_switch() - > default_value(false),"规范化正则化常量")``` (23认同)

Mar*_*cin 23

这是提供标志作为补充当前答案的选项的完整示例:

#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;
}
Run Code Online (Sandbox Code Playgroud)

我的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
Run Code Online (Sandbox Code Playgroud)

没有任何选项运行程序会导致:

./untitled4
overwrite is: false
Run Code Online (Sandbox Code Playgroud)

但是使用'-o'选项/标志运行会给出:

./untitled4 -o
overwrite is: true
Run Code Online (Sandbox Code Playgroud)

  • 如果不是很明显,程序选项的bool_switch(),就像值<T>()一样,可以选择一个指向变量的指针来保存该值(bool_switch()的类型为bool)所以假设例如`bool clobber;`事先声明你可以有`("overwrite,o",po :: bool_switch(&clobber) - > default_value(false),"enable file overwrite");` (2认同)