如何为D中的函数创建参考参数的默认值?

时间:2014-03-15 04:52:30

标签: function reference d

我的职能签名:

JSONValue get(string data, ref int parentCounter)

第二个参数必须通过引用传递并且是可选的。我的非工作变体:

JSONValue get(string data, ref int parentCounter = 10);
JSONValue get(string data, ref int parentCounter = int(10));
JSONValue get(string data, ref int parentCounter = new int(10));
JSONValue get(string data); // override also does not work

DMD32 D编译器v2.065

2 个答案:

答案 0 :(得分:3)

由于参数为ref,因此必须有一个地址。因此,它必须是左值表达式。

你可以这样做:

JSONValue get(string data, ref int parentCounter = *new int);

您目前无法使用此语法为新分配的int提供值。但是,在D 2.066中,您将能够写下:

JSONValue get(string data, ref int parentCounter = *new int(10));

这将在堆上分配新的int,除非在调用者站点指定了一个。{/ p>

您还可以使用静态变量或ref函数调用:

int defaultValue;

ref int defaultValueFun()
{
    auto i = new int;
    *i = 10;
    return *i;
}

JSONValue get(string data, ref int parentCounter = defaultValue);
// or
JSONValue get(string data, ref int parentCounter = defaultValueFun());

如果在defaultValue的引用仍然在使用时可能会调用value,请注意此技术。

答案 1 :(得分:1)

此时最简单的解决方案可能只是重载功能。 e.g。

JSONValue get(string data)
{
    int dummy = 10;
    return get(data, dummy);
}

JSONValue get(string data, ref int parantCounter)
{
    ...
}

它还避免了任何不必要的堆分配,不像cybershadow's suggestion of using *new int(10) 2.066一样(虽然能够做*new int(10)肯定会很酷)。

现在,您似乎在问题中指出由于某种原因,重载函数不起作用:

JSONValue get(string data); // override also does not work

所以,也许这个解决方案不适合你,但没有更多的信息,我不知道为什么它不会。当然,如果你正在处理自由函数,它会,如果你正在处理结构成员函数,它会。我能想到的唯一可能的问题是,如果你要覆盖基类函数,但即便如此,我能想到的唯一问题是基类是否声明了

JSONValue get(string data, ref int parentCounter)

并且你试图通过基类而不是派生类调用该函数,如果你这样做,那么在重写函数中使用默认参数无论如何都不会帮助你,因为基类没有声明一个 - 默认参数只有在通过派生类使用时才有效。当然,您可以覆盖基类'get,然后在派生类中添加一个看起来像

的重载
JSONValue get(string data)

因此,如果宣布这样的过载对您不起作用,我将需要更多详细信息,以帮助您找出它无法正常工作的原因。