Declaration
template < class CharT, class Traits = std::char_traits<CharT> > class basic_arument; typedef basic_argument<char> argument; #ifdef CLX_USE_WCHAR typedef basic_argument<wchar_t> wargument; #endif
Overview
コマンドライン引数を解釈するためのクラスです.引数は,必須要素とオプション要素に分かれます. 必須要素は,プログラム名の直後の引数 (argv[1]) から,最初に '-' で始まる引数が現れる直前までの集合を指します.オプション要素は,引数 (argv) の要素のうち '-' または "--" で始まるものを指します. この要素から先頭のハイフン文字列を除いた文字はオプション文字とされ, 要素へアクセスする際に使用します(args['X'][i] などのように).あるオプション要素から, 次のオプション要素の直前の引数までを,そのオプション要素の引数とします.
'-' に続く文字列は,それぞれを一つのオプション要素と見なします. 例えば,"-abc" と "-a -b -c" は同じ意味を持ちます. ただし,この方法でオプション要素を指定した場合, そのオプション要素は引数を持つことができません.
Example
#include <iostream> #include "clx/argument.h" int main(int argc, char* argv[]) { /* * 解析するcmdlineのBNF記法 * <program> [<nokey_param>]* (['-'[<key>]+] | ['-'+<key> [<param>]*])* */ clx::argument p; p.assign(argc, argv); int x, y, z; std::cout << "head paramters" << std::endl; std::cout << "------------------------------" << std::endl;; for (size_t i = 0; i < p.head().size(); i++) { std::cout << p.head().at(i) << std::endl; } std::cout << std::endl; /* * <key>に対応する<param>へアクセスする場合. * 第一引数には,<key>を指定する.カンマ(',')区切りで複数の<key>を指定する * ことが可能で,最初にヒットした<key>に対応する<param>の値を格納する. * * 第三引数は,<key>に対応する<param>のリストのうち,何番目の<param>を * 格納するか指定する.省略時には,0番目の<param>が格納される. */ p("s,space", x)('y', y, 2); std::cout << "s,space: " << x << std::endl; std::cout << "y[2]: " << y << std::endl; std::cout << std::endl; /* * '-'に続く文字列は,それぞれが一つの引数として扱われるため, * p.exist("abc")ではなく,p.exist("b")の条件文と一致する. */ if (p.exist("abc")) std::cout << "the abc parameter exists." << std::endl; if (p.exist('b')) std::cout << "the b parameter exists." << std::endl; return 0; }
Result (foo bar bas --space 1200 -y 100 200 300 -abc) head paramters ------------------------------ foo bar bas s,space: 1200 y[2]: 300 the b parameter exists.
Template Parameters
- CharT
- 文字の型を指定します.
- Traits
- 文字列を扱うためのtraitsを指定します.デフォルト値は, std::char_traits<CharT>.
Related Types
typedef CharT char_type; typedef size_t size_type; typedef std::basic_string<CharT, Traits> string_type; typedef std::vector<string_type> container_type; typedef std::map<string_type, container_type> map_type; typedef typename map_type::key_type key_type; typedef typename map_type::mapped_type param_list;
Construction and Member Functions
explicit basic_argument(char_type c = '-'); explicit basic_argument(int_type argc, char_type* argv[], char_type c = '-'); virtual ~basic_argument(); basic_argument& assign(int_type argc, char_type* argv[]);
Accessor
string_type program(); param_list& head(); param_list& operator[](const string_type& x); param_list& operator[](const char_type* x); param_list& operator[](char_type x);
解析し終わった後に各要素にアクセスするためのメソッド群です. program() はプログラム名,head() は必須要素にアクセスを行います. 返り値は std::vector なので,必要とする引数にアクセスを行うためには std::vector で提供されているメソッド,および演算子を用いて行います.
template <class ValueT> basic_argument& operator()(ValueT& dest, size_type n = 0); template <class ValueT> basic_argument& operator()(const string_type& key, ValueT& dest, size_type n = 0); template <class ValueT> basic_argument& operator()(const char_type* key, ValueT& dest, size_type n = 0); template <class ValueT> basic_argument& operator()(char_type key, ValueT& dest, size_type n = 0);
() 演算子は,key に対応する引数を dest に格納します. 引数が複数存在する場合は,何番目の引数を dest へ格納するのか, 引数 n で指定します.key を指定しない場合, 必須要素に対して操作が行われます.