C++
boost

【C++】boost::program_options でerrorをcatchする時にオプション名を表示させる

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 なんて使うなよ、みたいのがあったら教えてくだちい。