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(書類待ち)新国民年金基金(書類待ち)旧国民年金基金(書類待ち)
[ツッコミを入れる]