我想在函数(r / lvalue)中采用任何类型的值,并且我也要确保即使在值本身不是const的情况下,该值也不会在函数范围内被突变。
struct Tree(T) {
T item;
Tree!T* parent, left, right;
this(T item) {
this.item = item;
}
Tree!T* searchTree(const ref T item) {
if (&this is null)
return null;
if (this.item == item)
return &this;
return (this.item < item) ? this.right.searchTree(item) : this.right.searchTree(item);
}
}
unittest {
auto text1 = "Hello", text2 = "World";
auto tree2 = Tree!string(text1);
assert(tree2.searchTree(text2) is null);
assert(tree2.searchTree(text1) !is null);
}
这可与ref参数一起使用,但是如果我将int文字赋予该函数,它将失败:
auto tree1 = Tree!int(4);
assert(tree1.searchTree(5) is null);
assert(tree1.searchTree(4) !is null);
要救援的模板! D具有称为auto ref
的功能,该功能会自动为auto ref
和非ref
参数生成过载。唯一的要求是该功能必须是模板。
对于您的ref
函数,这意味着它需要具有此签名:
searchTree
通过简单的更改,您的代码就应该编译并执行The Right Thing™。