argv クラス

こんな感じがいいかなと。

namespace
{
struct Appliee : public Nevil::CmdOpt::ApplieeBase
{
  void Help(const std::string&)
  {
    /* 値を伴わないオプションでは引数なしで呼び出したいところだが... */
    std::cout << "help\n";
  }

  void Config(const std::string& path)
  {
    std::cout << "config: " << path << std::endl;
  }

  void Verbose(const std::string& value)
  {
    std::cout << "Verbose: " << value << std::endl;
  }
};
}

int main(int argc, char* argv[])
{
  using Nevil::CmdOpt;
  using Nevil::Cast;
  using Nevil::Apply;

  static CmdOpt::Spec optspec[] =
  {
    {"help",	Cast(&Appliee::Help),	 "display this help text and exit",	CmdOpt::NONE},
    {"config",	Cast(&Appliee::Config),  "configuration file",			CmdOpt::MANDATORY, 'c'},
    {"verbose", Cast(&Appliee::Verbose), "always print attribute informations", CmdOpt::OPTIONAL,  'v'},
  };

  Appliee appliee;
  Apply(optspec, argc, argv, appliee);
}
  • オプション仕様を動的に追加できたところでメリットはあまりないし
  • なので operator, や operator() をオーバーロードして頑張る意味がないし
  • 起動時しか動作しないのに std::map や std::string を使いまくるのもねぇとか
  • でも for, while, switch は書きたくねーしなとか
  • さらに usage を書くのに時間かけるのも無駄だなーとか
  • こーやってみると、まだ絞れるな。
    • NONE/MANDATORY/OPTIONAL いらねーな
    • メンバ関数の戻り値は bool にして unrecognize な時は false を返そう
    • optspec[] に unrecognize の時に呼び出すメンバ関数を追記できるようにしよう