Argument Parser
The class ArgumentParser is an utility class to parse commandline arguments. It follows two design principles:
- One Definition: the variable storage, commandline argument names as well as argument attributes are defined together once in a single place.
- Compile-Time Check: some inconsistencies are already checked at compile-time.
The general structure of the argument parser is show below.
auto parser = dacr::ArgumentParser(
<required-program-description-as-string>,
dacr::Arg<ArgName1, ArgType1>(ArgAttributes1...),
dacr::Arg<ArgName2, ArgType2>(ArgAttributes2...),
...
dacr::Arg<ArgNameN, ArtTypeN>(ArgAttributesN...)
);
Argument names must only contain letters or underscores or dashes. After the parser is defined, the commandline arguments passed to the program are parsed with:
auto args = parser.parse(argc, argv);
The arguments argc and argv refer to the variables passed to the main function. The result of the parse function is a NamedTuple with the following structure:
using ParseResult = dacr::NamedTuple<
dacr::Field<ArgName1, ArgType1>,
dacr::Field<ArgName2, ArgType2>,
...
dacr::Field<ArgName3, ArgType3>
>;
Argument Attributes
The ArgumentParser supports the following argument attributes:
| Attribute | Description | Usage |
|---|---|---|
help | The description for the argument. | help("<help_text>") |
mnemonic | Short variable name with a single dash (-<mnemonic>). The short variable name must only contain letters or underscores or dashes. | mnemonic("<short-variable>") |
optional | A default value for the argument. | optional(<default_value>) |
positional | An argument with a leading dash. | positional() |
store | The value to set for switch arguments if provided on the commandline. The default value is the negation then. | store(true|false) |
required | The attribute is required. | required() |
All non-positional arguments may be referred to with either --<arg-name> or -<mnemonic>. The mnemonics must not be single characters, such that -os is a valid mnemonic for a longer argument name.
Argument Types
The ArgumentParser supports the following arguments:
- Ordinary Arguments
- Optional Arguments
- Switch Arguments
- N-Ary Arguments
Ordinary Arguments
Ordinary arguments are defined by:
Arg<Name, Type>(attributes...)
The supported types are arithmetic types (char, int, long int, float, double) and class-types having a string-based construction. The supported attributes are help, mnemonic, optional and positional. The required attribute is not supported, but ordinary arguments with an optional attribute are implicitly required required.
Example
Arg<"threshold", int>(required(), optional(10)))
Optional Arguments
Optional arguments are defined by:
Arg<Name, std::optional<Type>>(attributes...)
The supported types are the same as for ordinary attributes. The supported attributes are help and mnemonic.
Example
Arg<"optional-value", std::optional<double>>(
mnemonic("ov"),
help("description")
)
Switch Arguments
Switch arguments are defined by:
Arg<Name, bool>(attributes...)
The supported attributes are help, mnemonic and store.
Example
Arg<"optional-value", std::optional<double>>(
mnemonic("ov"),
help("description")
)
N-Ary Arguments
N-ary arguments are defined by:
Arg<Name, std::vector<Type>>(attributes...)
The supported types are the same as for ordinary arguments. The supported attributes are help, mnemonic, positional and required. N-ary arguments marked as positional are implicitly assumed required.
Example
Arg<"list-argument", std::vector<int>>(positional())
Argument Summary
| Argument Type | Supported Types | Supported Attributes |
|---|---|---|
| Ordinary | char, int, long int, float, double, <Class>{string} | help, mnemonic, optional, positional |
| Optional | std::optional of char, int, long int, float, double, <Class>{string} | help, mnemonic |
| Switch | bool | help, mnemonic, store |
| N-Ary | std::vector of char, int, long int, float, double, <Class>{string} | help, mnemonic, positional, required |
Parsing
The arguments passed to the program are finally parsed with the parse function:
NamedTuple parse (int argc, char *argv[])
This function returns the parsed arguments as a NamedTuple.
Help
The ArgumentParser always prints a commandline help in case --help or -h is specified. The help output looks like this:
Program to showcase C++ argparse
./bazel-bin/examples/example_argparse [(--namespace ARG|-n ARG)] [(--switch|-s)] input...
Positional
----------
input: The input numbers [required] [n-ary]
Arguments
---------
--namespace(-n) ARG: The namespace
--switch(-s): Help text