我正在尝试在D中实现自己的范围,而我的.front()
方法遇到了问题。
我需要返回值为ref
。
如果我将其设为const
,则返回的对象将是副本,这不是我想要的。
如果我不使其成为const
,那么我就无法在我的范围的.front
副本上使用const
我该如何解决这个问题?
struct MyRange(T)
{
T[] buf;
@property ref T front() { return this.buf[0]; } // No error, but not const
@property ref T front() const { return this.buf[0]; } // Errors
@property T front() const { return this.buf[0]; } // No error, but a copy
// Can't have all three
}
答案 0 :(得分:7)
试试这个:
struct MyRange(T)
{
T[] buf;
@property ref T front() { return this.buf[0]; }
@property ref const(T) front() const { return this.buf[0]; }
}
您的示例中的问题是您创建了front
const而不是返回的值,并且编译器不会让您转义对const数据的可变引用。
现在,我要指出,一般来说,你不应该期望const范围能够很好地工作。就其本质而言,它们需要是可变的来迭代它们(因为你不能在const范围内调用popFront
),所以除了使用{{1}之外你不会做太多事情。 }和front
具有const范围。如果你可以隐式地将const范围转换为tail-const范围,那么情况也不会那么糟糕,但是这只适用于数组,并且没有人想出一个使用常规范围的好方法。不幸的是,const范围在这一点上基本没用。
答案 1 :(得分:0)
如果为前端创建单独的setter,该怎么办?
@property T front() const { return this.buf[0]; }//const
@property void front(T t) { this.buf[0]=t; }//allows assign when needed
这是你需要的吗?