rust 使用const函数计算泛型常数时的无约束泛型常数

06odsfpq  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(133)

在我的类型级编程之旅中,我遇到了一个相当奇怪的错误,我无法理解的无约束泛型常量。
下面是一个简单的例子:

  1. #![feature(generic_const_exprs)]
  2. const fn func1<T, U>() -> bool { true } // some logic
  3. const fn func2<T, U>() -> bool { false } // some logic
  4. // provide access to the bool constants for different types
  5. trait CompareResult {
  6. const R1: bool;
  7. const R2: bool;
  8. }
  9. struct CompareResultHolder<const R1: bool, const R2: bool>();
  10. impl<const R1: bool, const R2: bool> CompareResult for CompareResultHolder<R1, R2> {
  11. const R1: bool = R1;
  12. const R2: bool = R2;
  13. }
  14. trait CompareTypeList {
  15. type Compare<T>: CompareResult;
  16. }
  17. impl<T> CompareTypeList for T {
  18. type Compare<U> = CompareResultHolder<{func1::<T, U>()}, {func2::<T, U>()}>;
  19. }

字符串
Playground Link)的最大值
我试图提供一些通过对类型的操作计算出来的布尔值,并有一个trait允许轻松地访问这些值。

  1. <<T as CompareTypeList>::Compare<U> as CompareResult>::R1


编译器提供的提示也没有多大帮助:
“help:尝试使用以下表达式添加where绑定:where [(); {func2::<T, U>()}]:“。
我已经读到当impl本身可能导致冲突的实现时会发生这个错误,但在这里我不知道这是如何发生的,因为我只是试图计算常量值。
你知道这是怎么回事吗?

zxlwwiss

zxlwwiss1#

我可以通过在CompareTypeList trait周围移动泛型而不是只在Compare关联类型上移动泛型来编译它。也许可以在不做这种更改的情况下使用相同的技巧(尽管我找不到正确的语法)。

  1. #![feature(generic_const_exprs)]
  2. const fn func1<T, U>() -> bool { true } // some logic
  3. const fn func2<T, U>() -> bool { false } // some logic
  4. // provide access to the bool constants for different types
  5. trait CompareResult {
  6. const R1: bool;
  7. const R2: bool;
  8. }
  9. struct CompareResultHolder<const R1: bool, const R2: bool>;
  10. impl<const R1: bool, const R2: bool> CompareResult for CompareResultHolder<R1, R2> {
  11. const R1: bool = R1;
  12. const R2: bool = R2;
  13. }
  14. trait CompareTypeList<T> {
  15. type Compare: CompareResult;
  16. }
  17. impl<T, U> CompareTypeList<U> for T
  18. where
  19. [(); func1::<T, U>() as usize]:,
  20. [(); func2::<T, U>() as usize]:,
  21. {
  22. type Compare = CompareResultHolder<{func1::<T, U>()}, {func2::<T, U>()}>;
  23. }

字符串
where [(); {expr}]:的语法真的很奇怪,我在generic_const_exprstracking issue with link to doc)的design doc中发现了它。
AFAICT,它滥用数组类型来检查const表达式是否“格式良好”,这似乎基本上可以翻译为“可以用作数组容量”,这意味着我必须转换为usize
很明显,这个特性是非常非常未完成的,所以 caveat emptor(甚至编译器也会给出警告)。我完全期望(并真诚地希望)这个语法在稳定之前是不需要的或改变的。

展开查看全部

相关问题