如何将参考值和非参考值都接受为函数参数

问题描述 投票:1回答:1

我想在函数(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);
const d ref rvalue
1个回答
1
投票

要救援的模板! D具有称为auto ref的功能,该功能会自动为auto ref和非ref参数生成过载。唯一的要求是该功能必须是模板。

对于您的ref函数,这意味着它需要具有此签名:

searchTree

通过简单的更改,您的代码就应该编译并执行The Right Thing™。

© www.soinside.com 2019 - 2024. All rights reserved.