D 模板化类实例数组

D 模板化类实例数组,d,D,我一直在为一个应用程序编写一个命令行参数解析器。它们可以有三种类型:布尔型、字符串型或数值型。一个给定的参数需要一个给定的类型,所以这里没有猜测 我选择将一个参数表示为一个类,名为Arg。同一个开关可以出现多次,因此我希望跟踪标识,从而跟踪类 问题是,尽管有多种类型在起作用,但处理过程总是或多或少相同的。为了避免编写代码,我想我可以对Arg类进行模板化,基本上如下所示: class Arg(T) { public: T value; this(T def

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

我选择将一个参数表示为一个类,名为
Arg
。同一个开关可以出现多次,因此我希望跟踪标识,从而跟踪类

问题是,尽管有多种类型在起作用,但处理过程总是或多或少相同的。为了避免编写代码,我想我可以对
Arg
类进行模板化,基本上如下所示:

class Arg(T)
{
    public:
        T value;

        this(T defaultValue)
        {
            value=defaultValue;
        }
}
我的问题是,理想情况下,我只是将它们堆叠在一个动态数组中,但我必须首先知道它们的类型:我不能准确地将数组声明为
Arg!无论什么[]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; }
这看起来很难做到聪明

正确的方法是什么


谢谢你的帮助

使用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;
    }
}

FWIW,下面是我如何在D中实现参数解析器的:它们之间有公共接口吗?您可以创建一个基本类型,如
ArgBase
,它具有所需的共享功能,并使
Arg
模板类从中继承。如果您需要使用其他人不共享的某些参数的功能,那么您唯一的选择就是强制转换——这不是语言限制,只是在静态键入时不可能实现。我确实尝试过这样做,但归结为只使用对象,因为我一直在使用(模板化的)
字段。因此,尽管如此,我还是会一直将我的
ArgBase
转换为
Arg(T)
。这确实解决了我在变体方面的一个大问题,谢谢!我遇到的一个问题(看起来很傻)是我无法正确显示值。我的
Arg
有一个
toString(sink,fmt)
方法,它本身本质上调用
格式(“%s”,this.value)
。但是当我只需要值时,我会得到一个包含类型、参数等的完整表示。在文档中花了一些时间寻找解决方案(可能是另一个格式说明符?)之后,我想我应该这样问。