【问题标题】:boost-program-options: notifier for options with no valueboost-program-options:无价值选项的通知程序
【发布时间】:2011-11-02 17:43:11
【问题描述】:

只有当它们具有 value_semantic 时,才能将通知器用于已解析的选项。 给定通知程序自动处理无值选项的最佳方式是什么?

简单的方法是使用隐式赋值创建一个虚拟的 value_semantic,这样用户就可以在没有值的情况下传递选项。 这导致了显式提供值的可能性。 如果提供了值,可以添加运行时检查并引发错误。

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

【问题讨论】:

    标签: c++ boost-program-options


    【解决方案1】:

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

    #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
    

    【讨论】:

    • 如果不是很明显,程序选项的 bool_switch() 和 value() 一样,可以选择使用一个指向变量的指针来保存值(对于 bool_switch() 来说,它是 bool 类型)所以假设例如bool clobber; 事先声明你可以有("overwrite,o", po::bool_switch(&amp;clobber)-&gt;default_value(false), "enable file overwrite");
    【解决方案2】:

    俄罗斯程序员论坛上的一个人 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找到有关它的信息

    【讨论】:

    • bool_switch的使用示例:("normalize_regularizer,n", po::bool_switch()-&gt;default_value(false), "Normalize regularization constant")
    • 令人惊讶的是,我在 boost.po 文档中没有发现它。谢谢!
    【解决方案3】:

    使用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")
    ;
    

    【讨论】:

    • 是的,这是我最初的方法。但是,如果我在传递的键之后有一个位置选项,它必须由 got_foo 正确填充。这很棘手且不干净,会基于某些技术问题在不同选项之间产生不良关系。
    • 我不明白。当我在测试命令行上--foo 之后传递非选项时,其值不会存储在foo 的选项值中。 foo 选项的值是 "",因为这就是它的隐含值。
    • 您误解了implicit_value() 选项,它仅在没有提供值的情况下才有效,但随后一些值跟随它使用的键而不是隐式值。因此下一个传递的位置选项的值将用作我们的非值选项的值。看:my_program -key_with_no_value positional_option_value。这里positional_option_value 将被视为key_with_no_valueimplicit_value() 方法中传递的值
    猜你喜欢
    • 2016-11-12
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多