我一直在为应用程序编写命令行参数解析器。它们可以是三种类型:布尔值,字符串或数字。给定的参数将期望给定的类型,因此这里没有猜测。
我选择将一个自变量表示为一个名为Arg
的类。同一开关可以出现多次,所以我希望跟踪身份,因此要跟踪课程。
问题是,尽管有多种类型在起作用,但处理总是或多或少相同。为了避免编写代码,我以为可以对Arg
类进行模板化,基本上是这样的:
class Arg(T)
{
public:
T value;
this(T defaultValue)
{
value=defaultValue;
}
}
我的问题是,理想情况下,我只会将它们堆叠在动态数组中,但是我首先必须知道它们的类型:我无法将数组确切地声明为Arg!whatever[] myArray
。
我显然可以使用基本类型,例如Object[] array
。事情是,然后我必须在使用每个数组项之前强制转换它。我可以为此编写一个辅助函数,但似乎很难理解。但是,我将所有与类型相关的痛苦都保留在一个函数中。 (这是我在没有外部建议的情况下要做的事情)
我想我也可以维护单独的数组。但这不太方便:我需要考虑各种数字类型,如果要添加新的参数类型,则必须添加新的数组。
我也尝试使用std.variant
,但发现它们对我的目的不太方便。我可能用错了它们,但是我发现自己必须编写具有多个签名的完全相同的函数,格式为:
Algebraic!(string, bool, int) value;
this(string defaultValue) { this.value=defaultValue; }
this( bool defaultValue) { this.value=defaultValue; }
this( int defaultValue) { this.value=defaultValue; }
似乎很难工作。
正确的进行方式是什么?
感谢您的帮助!
答案 0 :(得分:2)
使用std.variant到底有什么问题?除了编写所有这些不同的重载,您还可以简单地使用模板化函数:
class Arg
{
private Algebraic!(string, bool, int) value;
this(T)(T defaultValue) if (is(T : string) || is(T : bool) || is(T : int))
{
this.value = defaultValue;
}
}