繁体   English   中英

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

[英]How to create default value for reference argument for function in 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

由于参数是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 ,否则它将在堆上分配一个新的int

您还可以使用静态变量或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仍在使用,虽然。

这时最简单的解决方案可能就是重载该函数。 例如

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

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

它也避免了任何不必要的堆分配,这与Cyber​​shadow建议在2.066退出后使用*new int(10)的建议不同(尽管能够进行*new int(10)肯定很酷)。

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

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

因此,也许该解决方案对您不起作用,但是如果没有更多信息,我不知道为什么不行。 当然,如果您要处理的是自由函数,则可以,如果您要处理的是struct成员函数,则可以。 我能想到的唯一可能的问题是,如果您要重写基类函数,但是即使如此,我能想到的唯一问题是,如果基类声明了

JSONValue get(string data, ref int parentCounter)

并且您试图通过基类而不是派生类来调用该函数,并且如果这样做,那么无论如何,在重写函数中使用默认参数都无济于事,因为基类没有声明一个-默认参数仅在通过派生类使用时才有效。 当然,您可以覆盖基类的get ,然后在派生类中添加一个如下所示的重载:

JSONValue get(string data)

因此,如果声明这样的重载对您不起作用,我将需要更多详细信息,以帮助您弄清为什么它不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM