使用1.5行代码创建功能齐全的命令行界面

2020-08-09 11:58:09

Fire for C++受python-fire的启发,是一个从函数签名创建命令行界面的库。以下是使用命令行将两个数字相加的整个程序:

#include<;iostream>;#include<;Fire.hpp>;int fired_main(int x=fire::arg(";-x&34;),int y=fire::arg(";-y&34;){std::cout<;<;x+y<;<;std::endl;return 0;}fire(Fired_Main)。

这不是一个微不足道的样本数量,特别是对于简单的脚本。正因为如此,程序员有时会跳过可选部分,但这会导致显著的可用性成本。此外,许多库在转换步骤中完全没有帮助。

使用FIRE-HPP,您只需调用FIRE(...)。并定义论点。当fired_main()作用域开始时,所有四个步骤都已经完成。

典型构造,如Expanding-abc<;=>;-a-b-c and-x=1<;=>;-x 1。

配置/构建:cmake..。&;&;cmake--生成。(或将后面的命令替换为适当的构建系统调用,例如,Make-J8或忍者)。

如果遇到错误,请清除build目录,并使用cmake-D DISABLE_PEDANIC=..将Pedonic警告作为错误禁用。(鼓励您打开一期)。

Int fired_main(int x=fire::arg(";-x";),int y=fire::arg(";-y&34;)){//定义并转换参数std::cout<;<;x+y<;<;std::endl;//使用x和y,它们是整数!Return 0;}fire(Fired_Main)//调用fired_main()

Fire(函数名)fire(Fired_Main)扩展为定义程序入口点的实际main()函数,并激发fired_main()。调用FIRED_MAIN时不带参数,因此强制编译器使用默认的FIRE::arg值。

Fire::arg(标识符)接受参数的名称/速记/描述/位置的构造函数。对其中几个使用大括号随附列表(例如,Fire::arg({";-x";,";--较长名称";,";参数说明";})或fire::arg({0,";零元素";})。该库要求单字符速记使用单个破折号,多字符名称使用两个破折号,描述使用零破折号。Fire::Arg对象应用作激发函数参数的默认值。有关详细信息,请参阅文档。

INT FIRED_MAIN(参数)这就是您认为的程序入口点。所有参数必须是bool、整数、浮点、fire::可选<;T>;、std::string或std::Vector<;T>;类型,并且使用Fire::Arg对象初始化的默认值(未能正确初始化将导致未定义的行为!)。请参阅转换以了解每种转换如何影响CLI。

火(...)。和Fire_no_space_Assignment(...)。两者都创建主函数来解析参数并调用...,但是它们在解析参数的方式上有所不同。火(...)。将PROGRAM-x 1解析为PROGRAM-x=1,但FIRE_NO_SPACE_ASSIGNMENT(...)。将-x解析为标志,将1解析为位置参数。

将位置参数和命名参数与空格分隔值混合使用无论如何都会造成糟糕的CLI,例如:程序a-xbc看起来不像a和c作为位置参数的-x=b。

标识符用于从命令行查找参数并提供说明。它可以由速记、详细名称、说明或职位组成(必须至少包含以下内容之一:速记、详细名称或职位)。如果只提供其中一个,则可以省略大括号。

如果未通过命令行提供值,则为默认值。可以是std::string、整型或浮点类型,而Fire::arg必须转换为相同类型。此默认设置也显示在帮助页面上。

为了方便地获取具有正确类型的参数并自动检查输入的有效性,Fire::arg类定义了几个隐式转换。

将命令行上的参数值转换为相应的类型。如果无法转换或默认值的类型错误,则显示错误。

用于没有合理默认值的可选参数。这样就不会在帮助消息中打印默认值。基础类型可以是std::string、整型或浮点型。

Fire::Optional是std::Optional的拆卸版本,具有与HAS_VALUE()、VALUE_OR()和VALUE()兼容的实现。

布尔标志在命令行上存在时为TRUE,在不存在时为FALSE。命令行上可以通过使用单个连字符作为前缀来打包多个单字符标志:-abc<;=>;-a-b-c。

获取所有位置参数的方法(不需要空间分配模式)。构造的对象可以转换为std::Vector<;std::string>;、std::Vector<;整型>;或std::Vector<;浮点类型>;。可以为帮助消息提供说明。使用Fire::arg::Vector禁止使用fire::arg(索引)提取位置参数。

这个库使用广泛的测试。单元测试位于tests/中,而Examples/用作集成测试。后者还确保示例是最新的。在提交之前,请验证python3./build/tests/run_Standard_tests.py是否成功。

Ubuntu 18.04 clang=={3.5,3.6,3.7,3.8,3.9,4.0}:C++11,C++14,clang=={5.0,6.0,7.0,8.0,9.0}:C++11,C++14,C++17。

改进帮助消息帮助消息具有更好的组织(在用法和描述中分开位置参数、命名参数、标志等)

确保API用户在可选位置参数后使用必需的位置参数时收到错误消息。

保存(...)。关键字将参数括起来,即使不是所有必需的参数都存在或正确(例如,For--版本)