4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?