2017-10-30 5 views
2

私はboost::program_options::options_descriptionを受け取る関数を持っています。いくつかのオプションを追加してから、それを返します。関数のスコープが終了し、オプションが消えると、私のオプションは永続化していないようです。どのように私はそれらを持続させるのですか?機能スコープの後で継続するためのboostプログラムオプションを取得する

#include <boost/program_options.hpp> 
#include <utility> 


void generic_args(boost::program_options::options_description desc, boost::program_options::positional_options_description p) { 
    desc.add_options() 
     ("input", boost::program_options::value<std::vector<std::string>>(), "input files") 
     ("help,h", "produce help message") 
     ("verbose,v", "put the pretty words and numbers on the light screen"); 

    p.add("input", -1); 
} 

int main(int argc, const char** argv) { 
    boost::program_options::options_description desc("Allowed options"); 
    boost::program_options::positional_options_description p; 
    generic_args(desc, p); 
    boost::program_options::variables_map parameters; 
    boost::program_options::store(boost::program_options::command_line_parser(argc, argv).options(desc).positional(p).run(), parameters); 
    boost::program_options::notify(parameters); 
    return 0; 
} 

ここでは出力です:

[email protected]:~/test/test_args$ g++ -std=c++11 main.cpp -o a.out -lboost_program_options 
[email protected]:~/test/test_args$ ./a.out 
[email protected]:~/test/test_args$ ./a.out --help 
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::program_options::unknown_option> >' 
    what(): unrecognised option '--help' 
Aborted (core dumped) 
+2

サードパーティのライブラリを掘り下げる前に、少なくとも基本的なC++を学ぶことをお勧めします。参照パラメータを使用します。 –

+0

私はPythonプログラマーです。サードパーティのライブラリを使用すると、私にとって完璧な意味があります。私の見解では、C++メモリ管理は、ここでは高度なトピックです。 :) – Scott

答えて

1

あなたが参照によって引数を取るようにgeneric_argsを変更する必要があります。

void generic_args(boost::program_options::options_description &desc, 
        boost::program_options::positional_options_description &p) 
{ 
    // ... 
} 

現在generic_argsは(彼らは」descpコピーを修正します値渡し)。

詳細はDoes C++ pass objects by value or reference?What's the difference between passing by reference vs. passing by value?をご覧ください。

+0

ありがとうございます。私は、JavaやPythonのような言語に慣れています。ここでは、「大きな」オブジェクトはいつも参照によって渡されます。 – Scott

+1

ようこそC++にようこそ。そして、あなたが内部化したら、あなたは***それらの参照が古くなるという事実に噛まれます。少なくとも数百回。あなたが生涯について意識し、価値の意味論を支持することを常に学ぶまで、 – sehe

関連する問題