2016-07-10 3 views
8

boost::program_optionsを使用して、他のオプションに依存するプログラムオプションを作成する方法はありますか?ブーストプログラムオプションの従属オプション

例えば、私のプログラムは、次のサンプルの引数を受け入れることができます。彼らはscanを伴っている場合は、この例では

wifi --scan --interface=en0 
wifi --scan --interface=en0 --ssid=network 
wifi --do_something_else 

を、interfacessid引数はのみ有効です。それらはscan引数に依存しています。

boost::program_optionsと自動的にこれを強制する方法はありますか?もちろん手動で実装することもできますが、より良い方法が必要であるようです。

+0

boost :: poにそれを伝える方法がないと思う:[value_semantic](http://www.boost.org/doc/libs/1_58_0/doc/html)のパブリックAPIを見てください。 /boost/program_options/value_semantic.html)( 'po :: value ()'ビット)と[option_description](http://www.boost.org/doc/libs/1_58_0/doc/html/boost/program_options /option_description.html) – Rerito

答えて

2

real.cppで説明されているように、小さな関数を定義するだけで2つの依存オプションを定義できます。その後、

void option_dependency(const boost::program_options::variables_map & vm, 
    const std::string & for_what, const std::string & required_option) 
{ 
    if (vm.count(for_what) && !vm[for_what].defaulted()) 
    if (vm.count(required_option) == 0 || vm[required_option].defaulted()) 
     throw std::logic_error(std::string("Option '") + for_what 
      + "' requires option '" + required_option + "'."); 
} 

と、この機能option_dependencyが1であることを右boost::program_options::store()

注意した後

option_dependency (vm, "interface", "scan"); 
option_dependency (vm, "ssid", "scan"); 

を呼び出す:たとえば、option_dependency()機能を規定している2つの依存(または競合する)オプションを指定することができます - 道だけ。この場合、ssidにはscanオプションが必要ですが、それ以外の方法は必要ありません。