2008年02月29日(金) [長年日記]
- まだ引っ越しの片付け終わってない。
- CではなくC++で作っていいみたい。よかった。今日からちゃんと作る。
- 今日の行数:179。全然進んどらん。
■ [c++] boost/program_options の positional_options がうまく動かない
以前にboostのprogram_optionsを使った際は、
command --opt value
のような形式のオプションの扱い方は分かったが
command param
のような形式のオプションの扱い方は分からなかった。今日チュートリアルを見ていたら、positional_options_description というクラスを使えばできそうなことが書いてあったので試した。
が、うまく動かない。boostのバージョンにより挙動が異なる。プログラムが間違えているのかなあ。boostのバージョンが1.34でないと動かないのだろうか。試したプログラムをメモ。
#include <iostream> #include <stdexcept> #include <string> #include <vector> #include <boost/program_options.hpp> namespace po = boost::program_options; using std::cerr; using std::cout; using std::exception; using std::string; using std::vector; int main(int argc, char* argv[]) { po::options_description options("Allowed options"); options.add_options() ("aaaa,a", po::value<string>()) ("help,h", "help"); po::positional_options_description xxxx; xxxx.add("XXXX", -1); po::variables_map vm; try { po::store( po::command_line_parser(argc, argv) .options(options) .positional(xxxx) .run(), vm); po::notify(vm); if (vm.count("help")) { cout << options; exit(0); } if (!vm.count("XXXX")) { cerr << "XXXX is required.\n"; // exit(2); } cout << "XXXX is " << vm["XXXX"].as<vector<string> >()[0]; } catch (exception& e) { cerr << e.what() << "\n" << options; exit(2); } }
手元のSUSE Linuxだと
$ ./a.out param unknown option XXXX Allowed options: -a [ --aaaa ] arg -h [ --help ] help $ $ rpm -qi boost | grep Version Version : 1.33.1 Vendor: SUSE LINUX Products GmbH, Nuernberg, Germany
CentOSだと
$ ./a.out param XXXX is required. boost::bad_any_cast: failed conversion using boost::any_cast Allowed options: -a [ --aaaa ] arg -h [ --help ] : help $ $ rpm -qi boost | grep Version Version : 1.32.0 Vendor: CentOS
SUSEは「po::store(」の所で例外が投げられてしまう。CentOSは「vm.count("XXXX")」の所でパラメータの存在を確認できないのと、「vm["XXXX"]」で取得できるオブジェクトの型が合わないのがおかしい。
■ やること
- クレジットカード
- 銀行
- 新税務署
移転のお知らせ- ダンボール
- 水道料金
確定拠出型年金(郵送)M(郵送)
■ 待機中
火災保険の申し込み(振込用紙待ち)E(書類待ち)新国民年金基金(書類待ち)旧国民年金基金(書類待ち)