Program_optionsをWindows環境で使用する方法

Boost::Program_optionsをWindows環境で使用する方法について。

Program_optionsをWindowsで使おうとすると2つ問題が起こる。

  1. WinMainにはargc、argvがない
  2. デフォルトでは「/h」とかのスラッシュから始まるオプションは受け付けてくれない。

argc,argvについては「__argc」、「__argv」(「__wargv」)を使うという手段がある。
または、「boost::program_options::split_winmain」というのが用意されているので、それを使用すればよい。

スラッシュについてはパース時のスタイルを変更してやればよい。
具体的にはboost::program_options::command_line_style::allow_slash_for_short」、
「 boost::program_options::command_line_style::allow_long_disguise」を使う。

まとめるとこんな感じ

using namespace boost::program_options;

variables_map vm;

int style = command_line_style::unix_style 
    | command_line_style::allow_long_disguise   // 「-num=10」のようなスタイルを許可
                                                //   (「--num=10」じゃなくてもOKにする)
    | command_line_style::allow_slash_for_short // 「/」によるオプション開始の許可
    ;

std::vector<std::wstring> args = split_winmain(cmdline);
store(wcommand_line_parser(args).style(style).options(cmdline_desc).run(), vm);


ここでは「unix_style」を使用しているが、これだと「-h」とかの引数も受け付けてしまうため、これを禁止したい場合は「unix_style」を使用せず、自分ですべてオプションを定義してやる必要がある。
unix_style」は

unix_style =  (allow_short | short_allow_adjacent | short_allow_next
             | allow_long | long_allow_adjacent | long_allow_next
             | allow_sticky | allow_guessing 
             | allow_dash_for_short)

なので、あとはよしなに・・・

ちなみに、Program_optionsについての記事が検索してもそんなに出てこないんだけど、余り皆使っていないのかな?
自分はこれ結構好きなんだけど。