boost::program_optionsを用いると、コマンドライン引数(オプション)を比較的容易に解析することができる。


#include <iostream>
#include <string>
#include <boost/program_options.hpp>

int main(int argc, char **argv) {
    boost::program_options::options_description opt("オプション");
    opt.add_options()
        ("help,h", "ヘルプを表示")
        ("name,n", boost::program_options::value(), "名称")
        ("count,c", boost::program_options::value()->default_value(10), "カウント")
        ("flag,f", boost::program_options::value(), "フラグ");
    boost::program_options::variables_map vm;
    try {
        boost::program_options::store(boost::program_options::parse_command_line(argc, argv, opt), vm);
    } catch(const boost::program_options::error_with_option_name& e) {
        std::cout << e.what() << std::endl;
        return 1;
    }
    boost::program_options::notify(vm);

    if (vm.count("help")) {
        std::cout << opt << std::endl;
    }

    if (vm.count("name")) {
        try {
            const std::string name = vm["name"].as();
        	std::cout << name << std::endl;
        } catch (const boost::bad_any_cast& e) {
            std::cout << e.what() << std::endl;
        }
    }

    const int count = vm["count"].as();
    std::cout << count << std::endl;

    if (vm.count("flag")) {
        try {
            const bool flag = vm["flag"].as();
        	std::cout << flag << std::endl;
        } catch (const boost::bad_any_cast& e) {
            std::cout << e.what() << std::endl;
        }
    }
    return 0;
}

簡単にコードの解説を行う。

  • 「boost::program_options::options_description opt("オプション");」でオプションの名称を設定している。
  • add_options関数によりコマンドライン引数(オプション)を設定している。
    • 「("help,h", "ヘルプを表示")」は「--help」または「-h」を指定すると、ヘルプを表示することを意味している。
    • 「("name,n", boost::program_options::value(), "名称")」は「--name Michael」または「-n Michael」のような方法でstring型を受け取ることができること意味している。
    • 「("count,c", boost::program_options::value()->default_value(10), "カウント")」は「--count 10」または「-c 10」のような方法でint型を受け取ることができることを意味している。省略された場合は10が挿入される。
    • 「("flag,f", boost::program_options::value(), "フラグ")」は「--flag on」または「-f on」のような方法でbool型を受け取ることができることを意味している。ここで、trueまたはfalseを設定する方法は以下の通りである。
      • true:「on」「yes」「1」「true」
      • false:「off」「no」「0」「false」
  • 「boost::program_options::variables_map vm;」~「boost::program_options::notify(vm);」までで、コマンドライン引数(オプション)をvmに格納および解析を行っている。
  • 実際にコマンドライン引数(オプション)が指定されているかは、variables_mapのメンバ関数countを用いて判定し、取り出しは「const std::string name = vm["name"].as();」のように行えばよい。

このままコンパイルを行うと以下のようなエラーが発生する。


/tmp/ccXU9eeH.o: 関数 `main' 内:
main.cpp:(.text+0x605): `boost::program_options::options_description::m_default_line_length' に対する定義されていない参照です
main.cpp:(.text+0x60f): `boost::program_options::options_description::m_default_line_length' に対する定義されていない参照です
main.cpp:(.text+0x657): `boost::program_options::options_description::options_description(std::string const&, unsigned int, unsigned int)' に対する定義されていない参照です
main.cpp:(.text+0x68c): `boost::program_options::options_description::add_options()' に対する定義されていない参照です

これはコンパイル時に「-lboost_program_options」を指定していないためである。注意点として、「-lboost_program_options」は必ず最後に指定することである。


g++ -o2 main.cpp -o main -lboost_program_options

関連する記事

  • 相関係数相関係数 相関係数とは2変量のデータ間の関係性の強弱を計る統計学的指標である。相関係数rがとる値の範囲は-1≦r≦1である。相関係数rの値により以下のように呼ばれる。 -1≦r<0ならば負の相関 r=0ならば無相関 0<r≦1ならば正の相関 一般的に、強弱も合わせて以下のように呼ばれる。 […]
  • R実装と解説 対応のない2標本の母平均の差の検定(母分散が等しい) [latexpage] 母分散が等しい場合の対応のない2標本の母平均の差の検定とは、2つの母集団が正規分布に従い、ともに母分散が等しいと仮定できるとき、一方の母平均が他方の母平均と「異なる」または「大きい」、「小さい」かどうかを、検定統計量がt分布に従うことを利用して検定します。 統計的検定の流れ 検定の大まかな流れを確認しておきます。 […]
  • なぜマイナス×マイナス=プラスとなるのかなぜマイナス×マイナス=プラスとなるのか 先日、ある人と話しているときに、私が大学で数学を学んだことを告げると、「なぜ、マイナス×マイナス=プラスとなるのか」と質問を受けた。 どうやら、「マイナス×マイナス=プラス」はルールとして覚えているようだった。 この質問を受けたとき、正直に言うと「すばらしい」と思った。なぜそう思ったのかというと、すでに当たり前として組み込まれている「マイナス×マイナス=プラス」に対し […]
  • 統計的因果推論による傾向スコアとIPW推定量の基本的な考え方統計的因果推論による傾向スコアとIPW推定量の基本的な考え方 [latexpage] 統計的因果推論による因果効果を調べる手段として、傾向スコアとIPW推定量という概念があります。ここでは、なぜ傾向スコアを考えるのか、傾向スコアの逆数の重み付けはどのような意味があるのかを、複雑な数式を用いずに具体例を通してご説明します。 さっそくですが、次の具体例を考えます。 […]
  • さくらVPSのUbuntuでWordPressをHTTPからHTTPSへ移行する手順さくらVPSのUbuntuでWordPressをHTTPからHTTPSへ移行する手順 当サイトをhttpsに移行した手順をお伝えいたします。 当サイトはさくらVPS上のUbuntu 14.04LTSでWordPressを構築して運用しております。そこで、SSLサーバ証明書はさくらインターネットのサービスであるラピッドSSLを使用することにしました。このサービスを選んだ理由は次になります。 価格が安い […]
C++ Boostによるコマンドライン引数処理