我正在编写一个命令行解释器,并且正在尝试为各个命令设置格式。我有诸如命令名称、最大参数数量和最小参数数量之类的东西。我想要一个集合,一个参数类型的原型。我的第一个想法只是声明一个没有泛型的向量,但后来我意识到这不是 Java。
假设我有一个命令,例如“read test.dat 2”,我想要一个结构,显示典型的读取命令有一个字符串,然后是一个整数。
有任何想法吗?
我正在编写一个命令行解释器,并且正在尝试为各个命令设置格式。我有诸如命令名称、最大参数数量和最小参数数量之类的东西。我想要一个集合,一个参数类型的原型。我的第一个想法只是声明一个没有泛型的向量,但后来我意识到这不是 Java。
假设我有一个命令,例如“read test.dat 2”,我想要一个结构,显示典型的读取命令有一个字符串,然后是一个整数。
有任何想法吗?
我不太清楚你在问什么,所以我可能弄错了。
根据您的描述,听起来好像您有一个抽象的命令概念,并且它们具有名称和参数方面的预期结构。根据您的描述,听起来您需要一个类型标识符列表以及它们是否是可选的指示。
然后,您可以为您希望使用的每个命令实例化一个命令对象,并将它们全部添加到命令集合中。
或者,使用映射集合将命令名称映射到实际的命令对象。每个命令对象还可以保存对处理程序对象的引用以实际执行命令。
如果您想要一个可以存储一组固定类型的容器,您可以使用以下之一boost::variant
:
typedef boost::variant<std::string, int> optval;
typedef std::vector<optval> options;
现在,您可以将字符串或整数 push_back 放入向量中,并且变体将记录它包含的内容:
options opts;
opts.push_back(10);
opts.push_back("hello");
您可以在Boost variant的文档中了解它,包括如何从变体中获取正确的值。如果您已经设置了命令行解析,并且不再需要用于此的库,您当然也可以拥有从参数名称到此类变体的映射:
std::map<std::string, optval> map;
map["--max-foo"] = 10;
map["--title"] = "something fun";
如果你想解析程序的命令行参数,你可以查看Boost.Program Options库,它将极大地帮助你做到这一点。
然而,大多数情况下,我最终使用 posixgetopt
函数,它也可以解析命令行。我建议您先查看 boost 程序选项,如果您觉得它太重,您可以查看 getopt(请参阅 参考资料man 3 getopt
)
像这样的东西,也许:
enum ParameterType
{
Int,
String
};
struct Command
{
string name;
vector<ParameterType> maxParameters;
int minParameters;
};