Value_semanticがある場合にのみ、解析されたオプションに通知機能を使用できます。値のないオプションを特定の通知機能によって自動的に処理するための最良の方法は何ですか?
単純なアプローチは、暗黙的な割り当てを使用してダミーのvalue_semanticを作成することです。これにより、ユーザーは値なしでオプションを渡すことができます。これにより、明示的に値が提供される可能性があります。値が指定されているかどうかの実行時チェックを追加して、エラーをスローすることができます。
更新:ただし、位置オプションの値は値なしオプションの後に続く可能性があるため、これは位置オプションが存在する場合は機能しません。指定された値として例外が発生します。
ロシアのプログラマーフォーラムのある男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 で見つけることができます。
これは、現在の回答を補完するオプションとしてフラグを提供する完全な例です。
#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")
;