CLX C++ Libraries - argument
Author: clown

CLX C++ Libraries
Home >> argument

# 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

example_argument.cpp

    #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);

    bool exist(const string_type& x);
    bool exist(const char_type* x);
    bool exist(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 を指定しない場合， 必須要素に対して操作が行われます．