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
C++ Boostによるコマンドライン引数処理