C++でプログラムを書く時、boost::program_optionsを使ってコマンドライン引数を受け取る時の話。
3種類のオプションを同時に読み込む時、
using namespace boost::program_options;
variables_map &values;
...(中略)
try {
val1 = values[optname1].as<int>();
val2 = values[optname2].as<int>();
val3 = values[optname3].as<int>();
} catch(const boost::bad_any_cast& e) {
std::cout << e.what() << std::endl;
exit(0);
}
でtrycatchしてると、受け取った型がおかしい時に
boost::bad_any_cast: failed conversion using boost::any_cast
とエラーが返る。
でもこれだとどのオプションがエラーを吐いたのかわからん。
それを解決する関数を作ったよ。
template <class T>
T getVal(const variables_map &values, const std::string &optname)
{
try {
return values[optname].as<T>();
}
catch (const boost::bad_any_cast& e) {
std::cout << "option --"<< optname << ": "<< e.what() << std::endl;
exit(0);
}
}
これで、
val1 = values[optname1].as<int>();
の代わりに
val1 = getVal<int>(values, optname1);
とすればエラーを吐いた時にオプション名も表示してくれる。
もっといい方法があるだろ、とか、コマンド引数の受け取りにBoost なんて使うなよ、みたいのがあったら教えてくだちい。