2017-02-08 7 views
0

boost::program_options::variables_mapを編集して、最初の位置オプションで暗黙のオプションを追加しようとしています。ただしboost::variables_mapで使用すると、po::storeを使用して2度目の動作はできません。ここで `boost :: program_options`は` variables_map`に `store`を二度使えません

が失敗し、最小限の例です: 保存されていないたつまり

dummy-int 3 
verbose 

dummy-int 3 
verbose 

、オプションdummy

#include <boost/program_options.hpp> 
#include <iostream> 
#include <ostream> 
#include <string> 
#include <vector> 

namespace po = boost::program_options; 

std::ostream &operator<<(std::ostream &s, po::variables_map const &vm) 
{ 
    for (const auto& it : vm) 
    { 
     s << it.first.c_str() << " "; 
     auto& value = it.second.value(); 
     if (auto v = boost::any_cast<char>(&value)) 
      s << *v; 
     else if (auto v = boost::any_cast<short>(&value)) 
      s << *v; 
     else if (auto v = boost::any_cast<int>(&value)) 
      s << *v; 
     else if (auto v = boost::any_cast<long>(&value)) 
      s << *v; 
     else if (auto v = boost::any_cast<std::string>(&value)) 
      s << *v; 
     else if (auto v = boost::any_cast<std::vector<std::string>>(&value)) 
     { 
      s << "["; 
      for(const auto &w : *v) 
       s << " " << w; 
      s << " ]"; 
     } 
     else 
      s << "<?>"; 
     s << '\n'; 
    } 
    return s; 
} 

int main(int argc, char **argv) 
{ 
    po::options_description desc("Options"); 
    desc.add_options() 
     ("help","show this help message") 
     ("verbose","print extra messages") 
     ("dummy","pointless") 
     ("dummy-int", po::value<int>(), "pointless") 
     ("dummy-str", po::value<std::string>(), "pointless") 
    ; 

    po::variables_map vm; 
    po::store(po::parse_command_line(argc, argv, desc), vm); 
    po::notify(vm); 

    bool verbose = vm.count("verbose"); 

    if(verbose) 
     std::cout << vm << std::endl; 

    if(vm.count("help")) 
    { 
     std::cout << desc << std::endl; 
     return 0; 
    } 

    const char* newOption = "--dummy"; 
    po::store(po::parse_command_line(1, &newOption, desc), vm); 
    po::notify(vm); 

    if(verbose) 
     std::cout << vm << std::endl; 

    return 0; 
} 

ビルを、プログラムを実行している、私は端末上で見ることができますvmに!どうしていいか分からないのですか?何か助けてくれてありがとう!

+0

ありがとうございました!あなたは答えでそれを言っておく必要がありましたので、私はその質問に回答としてマークすることができました。 –

+0

完了:コメントは削除されました。 –

答えて

2

最初の引数には特別な意味があることを忘れています。これは呼び出されたときのプログラムの名前です。 documentationによると

:これがあれば

argv[0]「は」プログラム自体を呼び出すために使用される名前(または空の文字列を表し、NULLで終了するマルチバイト文字列の最初の文字へのポインタであります実行環境ではサポートされていません)。

スニペット

const char* newOption = "--dummy"; 
po::store(po::parse_command_line(1, &newOption, desc), vm); 

ではあなたがどんな引数を指定していない、とライブラリが構文解析するために何もない意味argvとして1つの要素の配列を渡します。したがって、variable_mapインスタンスには何も追加されません。

関連する問題