boost::program_options を使用して、構成ファイルからパラメーターを取得しています。
私は手動でファイルを作成でき、プログラムオプションがそれを解析することを理解しています。しかし、プログラムがファイルを自動的に生成する方法を探しています。オプションの名前とその値を出力することを意味します。例えば:
>./main
オプションを指定しないと、次のような init.cfg が生成されます
[wave packet]
width = 1
position = 2.0
[calculation parameters]
levels = 15
次に、そのファイルに移動し、テキスト エディターを使用して値を変更し、このファイルを使用します。
>./main init.cfg
これにアプローチする良い方法は、variables_map を持つことoperator<<
です。このようにして、ファイルに書き込むことができます。値を変更します。ファイルを読み取ります。すべて同じ形式で、各行を記述する必要はありません。
ドキュメントや例でそのようなものを見つけることができませんでした。これが可能かどうか教えてください
編集: Sam Miller は、セクションで ini ファイルを解析する方法を示しました。ただし、boost::program_options::variables_map vm から値を取得する際にまだ問題があります。私は次のことを試しました
for(po::variables_map::iterator it = vm.begin(); it != vm.end(); ++it)
{
if(it->first!="help"&&it->first!="config")
cout << "first - " << it->first << ", second - " << it->second.value() << "\n";
}
の代わりにit->second.value()
、エラーが発生しました。私も試しit->second
ました。私もエラーが発生しました:
icpc -lboost_serialization -lboost_program_options -c programOptions.cc
programOptions.cc(60): error: no operator "<<" matches these operands
operand types are: std::basic_ostream<char, std::char_traits<char>> << boost::any
cout << "first - " << it->first << ", second - " << it->second.value() << "\n";
^
compilation aborted for programOptions.cc (code 2)
make: *** [programOptions.o] Error 2
使用すると値が正しく取得されますit->second.as<int>()
が、すべての値が int であるとは限らず、double に達すると、プログラムは次のようにクラッシュします。
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_any_cast> >'
what(): boost::bad_any_cast: failed conversion using boost::any_cast