メモの日々


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(書類待ち)
  • 新国民年金基金(書類待ち)
  • 旧国民年金基金(書類待ち)