argparse 是现代 C++ 程序参数解析库。该库是 header-only 的,使用该库需要使用 C++ 17。
argparse 支持位置参数,可选参数
位置参数语法支持:
_empty_
: 参数命令为空
'-'
: 参数命令为 -
'-' decimal-literal
: 参数命令为 -
加数字
!'-' anything
: 不带前缀 -
的任何命令
ArgumentParse 类
constructor
enum class default_arguments : unsigned int { none = 0, help = 1, version = 2, all = help | version, };
explicit ArgumentParser(std::string program_name = {}, std::string version = "1.0", default_arguments add_args = default_arguments::all);
ArgumentParser(const ArgumentParser &other) ArgumentParser &operator=(const ArgumentParser &other)
ArgumentParser(ArgumentParser &&) noexcept = default; ArgumentParser &operator=(ArgumentParser &&) = default;
|
构造函数构造一个参数解析器,解析器会根据传入的 add_args
参数设置对应默认参数。默认参数包括 help
和 version
。对应的参数如下:
help
: -h
, --help
version
: -v
, --version
add_argument
template <typename... Targs> Argument &add_argument(Targs... f_args)
|
添加参数。传入的是变长参数,是构造 Argument 类的第二个参数,即 std::array<std::string_view, N>&& a
。
添加参数后,实际内部会构造一个 Argument 对象,然后保存到一个 map 中,key 是命令参数,value 是 Argument 对象。
add_parents
template <typename... Targs> ArgumentParser &add_parents(const Targs &... f_args)
|
添加父级 ArgumentParser 对象的参数到该 ArgumentParser 对象中
add_description
ArgumentParser &add_description(std::string description);
|
添加参数描述
add_epilog
ArgumentParser &add_epilog(std::string epilog)
|
set_prefix_chars
ArgumentParser &set_prefix_chars(std::string prefix_chars);
|
设置可选参数的前缀
set_assign_chars
ArgumentParser &set_assign_chars(std::string assign_chars);
|
设置命令行中赋值字符,默认为 =
。
parse_args
void parse_args(int argc, const char *const argv[]); void parse_args(const std::vector<std::string> &arguments);
auto parse_known_args(int argc, const char *const argv[]); std::vector<std::string> parse_known_args(const std::vector<std::string> &arguments)
|
解析参数
get
template <typename T = std::string> auto get(std::string_view arg_name);
|
获取参数值,如果未设置则获取默认值,转换为对应的类型
present
template <typename T = std::string> auto present(std::string_view arg_name) const -> std::optional<T>
|
获取参数值,如果未设置,则返回 std::optional
的空值 std::nullopt
is_used
auto is_used(std::string_view arg_name) const
|
对于用户提供了的可选参数时,返回 true,未提供则返回 false
is_subcommand_used
auto is_subcommand_used(std::string_view subcommand_name) const;
|
operator[]
Argument &operator[](std::string_view arg_name) const
|
获取指定命令行参数值
operator<<
friend std::ostream& operator<<(std::ostream &stream, const ArgumentParser &parser) ->
|
输出流支持,用于打印
help
std::stringstream help() const;
|
获取帮助信息,用于打印
usage
std::string usage() const;
|
获取命令行使用说明,用于打印
print_help
std::string print_help() const;
|
add_subparser
void add_subparser(ArgumentParser &parser)
|
添加子 ArgumentParser
Argument 类
Argument 类中的各个函数都是返回的 Argument&
,所以 Argument 函数是支持链式调用的。
constructor
template <std::size_t N, std::size_t... I> explicit Argument(std::string_view prefix_chars, std::array<std::string_view, N>&& a, std::index_sequence<I...> )
template <std::size_t N> explicit Argument(std::string_view prefix_chars, std::array<std::string_view, N>&& a)
|
help
Argument& help(std::string help_text);
|
设置 --help
展示的帮助中的参数描述。
Argument& metavar(std::string metavar);
|
设置 metavar
default
template <typename T> Argument& default_value(T&& value);
|
设置参数的默认值
required
设置参数是否是必须的,如果不是必须的,则是可选的
implicit_value
Argument& implicit_value(std::any value);
|
设置参数的隐式值
action
template <class F, class... Args> auto action(F&& callable, Args&&... bound_args);
|
设置参数执行的动作(函数)
append
设置参数是否是可重复的,支持多个值
scan
template <char Shape, typename T> auto scan() -> std::enable_if_t<std::is_arithmetic_v<T>, Argument&>
|
执行类型转换 action
nargs
Argument& nargs(std::size_t num_args); Argument& nargs(std::size_t num_args_min, std::size_t num_args_max); Argument& nargs(nargs_pattern pattern);
|
通常情况下,一个命令行参数是与一个 action 进行关联的。nargs
可以将多个参数与一个 action 进行关联。
nargs
设置关联参数的个数范围或模式。模式支持 optional
, any
, at_least_one
。各模式对应的范围如下:
optional
: [0, 1]
any
: [0, max]
at_least_one
: [1, max]
remaining
consume
template <typename Iterator> Iterator consume(Iterator start, Iterator end, std::string_view used_name = {});
|
validate
验证参数是否有效
get_inline_usage
std::string get_inline_usage() const;
|
获取使用说明字符串
get_arguments_length
std::size_t get_arguments_length() const;
|
operator<<
friend std::ostream &operator<<(std::ostream &stream, const Argument &argument);
|
支持输出流,可用于打印
operator!= & operator==
template <typename T> bool operator!=(const T &rhs) const
template <typename T> bool operator==(const T &rhs)
|