[英]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)
{
...
}
它也避免了任何不必要的堆分配,这与Cybershadow建议在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.