Есть ли способ обойти неиспользуемый параметр типа?

Код:

trait Trait<T> {}

struct Struct<U>;

impl<T, U: Trait<T>> Struct<U> {}

Ошибка:

error[E0207]: the type parameter `T` is not constrained by the impl trait, self type, or predicates
 --> src/main.rs:5:6
  |
5 | impl<T, U: Trait<T>> Struct<U> {}
  |      ^ unconstrained type parameter

Похоже, что RFC 447 запрещает этот шаблон; есть ли способ обойти это? Я думаю, что это можно решить, изменив T на связанный тип, но это помешает мне выполнять мультидиспетчеризацию.


person 盛安安    schedule 24.01.2015    source источник


Ответы (1)


Параметр типа, который не используется в структуре, может использовать PhantomData:

struct Struct<U> {
    _marker: PhantomData<U>,
}

impl<U> Struct<U> {
    fn example<T>(&self)
    where
        U: Trait<T>,
    {
        // use `T` and `U`
    }
}
person huon    schedule 24.01.2015
comment
Вау, я не знал, что уже можно использовать предложение where в методах. Rust действительно удивительный язык. - person 盛安安; 24.01.2015