29

解析されたオプションにnotifierを使用できるのは、それらにvalue_semanticがある場合のみです。値のないオプションを特定の通知機能によって自動的に処理するための最良の方法は何ですか?

簡単なアプローチは、暗黙の代入を使用してダミーのvalue_semanticを作成することです。これにより、ユーザーは値なしでオプションを渡すことができます。これにより、値が明示的に提供される可能性があります。値が提供されているかどうかの実行時チェックを追加して、エラーをスローすることができます。

更新:ただし、位置オプションの値は値なしオプションの後に続く可能性があるため、これは位置オプションの存在下では機能しません。これは、与えられた値として例外を発生させるためです。

4

3 に答える 3

44

One guy OXPEHOMETP on a russian programmers forum gave me a pice of advice to use boost::program_options::bool_switch().

When defining an option with no value via value-permitted interface, one must pass not boost::program_options::typed_value() as semantics, but bool_switch(). This means that no value can be explicitly taken for this option from the command line. One can find info about it at http://www.boost.org/doc/libs/release/doc/html/boost/program_options/bool_switch.html

于 2011-09-01T22:14:46.817 に答える
28

これは、現在の回答を補完するオプションとしてフラグを提供する完全な例です。

#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
于 2015-01-25T04:32:16.993 に答える
1

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")
;
于 2011-08-29T23:57:13.680 に答える