在我的类型级编程之旅中,我遇到了一个相当奇怪的错误,我无法理解的无约束泛型常量。
下面是一个简单的例子:
#![feature(generic_const_exprs)]
const fn func1<T, U>() -> bool { true } // some logic
const fn func2<T, U>() -> bool { false } // some logic
// provide access to the bool constants for different types
trait CompareResult {
const R1: bool;
const R2: bool;
}
struct CompareResultHolder<const R1: bool, const R2: bool>();
impl<const R1: bool, const R2: bool> CompareResult for CompareResultHolder<R1, R2> {
const R1: bool = R1;
const R2: bool = R2;
}
trait CompareTypeList {
type Compare<T>: CompareResult;
}
impl<T> CompareTypeList for T {
type Compare<U> = CompareResultHolder<{func1::<T, U>()}, {func2::<T, U>()}>;
}
字符串
(Playground Link)的最大值
我试图提供一些通过对类型的操作计算出来的布尔值,并有一个trait允许轻松地访问这些值。
<<T as CompareTypeList>::Compare<U> as CompareResult>::R1
型
编译器提供的提示也没有多大帮助:
“help:尝试使用以下表达式添加where
绑定:where [(); {func2::<T, U>()}]:
“。
我已经读到当impl本身可能导致冲突的实现时会发生这个错误,但在这里我不知道这是如何发生的,因为我只是试图计算常量值。
你知道这是怎么回事吗?
1条答案
按热度按时间zxlwwiss1#
我可以通过在
CompareTypeList
trait周围移动泛型而不是只在Compare
关联类型上移动泛型来编译它。也许可以在不做这种更改的情况下使用相同的技巧(尽管我找不到正确的语法)。字符串
where [(); {expr}]:
的语法真的很奇怪,我在generic_const_exprs
(tracking issue with link to doc)的design doc中发现了它。AFAICT,它滥用数组类型来检查const表达式是否“格式良好”,这似乎基本上可以翻译为“可以用作数组容量”,这意味着我必须转换为
usize
。很明显,这个特性是非常非常未完成的,所以 caveat emptor(甚至编译器也会给出警告)。我完全期望(并真诚地希望)这个语法在稳定之前是不需要的或改变的。