模板化类实例的数组

时间:2019-05-22 12:37:18

标签: d

我一直在为应用程序编写命令行参数解析器。它们可以是三种类型:布尔值,字符串或数字。给定的参数将期望给定的类型,因此这里没有猜测。

我选择将一个自变量表示为一个名为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; }

似乎很难工作。

正确的进行方式是什么?

感谢您的帮助!

1 个答案:

答案 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;
    }
}