gpt4 book ai didi

constants - D 中烦人的传递常量问题

转载 作者:行者123 更新时间:2023-12-04 10:18:30 25 4
gpt4 key购买 nike

我遇到了一个关于 D 中传递常量的非常烦人的问题。

我有下面的代码:

struct Slice(T)
{
T items;
size_t start, length, stride;

this(T items, size_t start = 0, size_t length = size_t.max, size_t stride=1)
{
if (length == size_t.max)
{ length = 1 + (items.length - start - 1) / stride; }

this.items = items;
this.start = start;
this.length = length;
this.stride = stride;
}

Slice!(T) opSlice(size_t a, size_t b)
{
// Everything is fine here
return Slice!(T)(items, start + a * stride, b - a, stride);
}

const(Slice!(T)) opSlice(size_t a, size_t b) const
{
// ERROR! 'items' is const(T), not T.
return const(Slice!(T))(items, start + a * stride, b - a, stride);
}
}

我遇到的问题几乎是数据类型 const(Slice!int)Slice!const(int)const(Slice!const(int))只是……很奇怪。

我如何过载 opSlice上面,返回当前切片的常量副本 随后可以像原始切片一样使用 ?

换句话说,假设我有:
void test(in Slice!(int[]) some_slice)
{
//...
}

void main()
{
auto my_slice = Slice!(int[])();
const my_const_slice = my_slice;
test(my_slice); // succeeds
test(my_const_slice); //succeeds
test(my_const_slice[0 .. 1]); // fails
}

上面的代码不起作用。什么是 最好的使它工作的方法? (我当然可以总是模板化 test() ,但是所有切片变化 - const(Slice!(Slice!const(int[]))) 等等 - 都会呈指数增长,并且令人困惑。)

编辑:

是否有适用于 struct 的解决方案s 和 class是吗?

最佳答案

将构造函数更改为

inout this(inout T items, size_t start = 0, size_t length = size_t.max, size_t stride=1)
{
if (length == size_t.max)
{ length = 1 + (items.length - start - 1) / stride; }

this.items = items;
this.start = start;
this.length = length;
this.stride = stride;
}

inout 关键字是为此而制作的,它让参数的常量性/不变性传播到结果

关于constants - D 中烦人的传递常量问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7948612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com