Есть ли способ сказать компилятору, что никто не будет реализовывать черту для ссылки на универсальный тип? - PullRequest
0 голосов
/ 25 апреля 2018

Вот игрушечный код, который демонстрирует проблему:

trait Foo {}

trait Boo<T> {
    fn f() -> T;
}

impl<T> Boo<T> for i32
where
    T: Foo,
{
    fn f() -> T {
        unimplemented!();
    }
}

impl<'a, T> Boo<&'a T> for i32
where
    T: Foo,
{
    fn f() -> T {
        unimplemented!();
    }
}

Я хочу иметь две общие реализации trait Boo, но он не компилируется:

error[E0119]: conflicting implementations of trait `Boo<&_>` for type `i32`:
  --> src/main.rs:16:1
   |
7  | / impl<T> Boo<T> for i32
8  | | where
9  | |     T: Foo,
10 | | {
...  |
13 | |     }
14 | | }
   | |_- first implementation here
15 | 
16 | / impl<'a, T> Boo<&'a T> for i32
17 | | where
18 | |     T: Foo,
19 | | {
...  |
22 | |     }
23 | | }
   | |_^ conflicting implementation for `i32`
   |
   = note: downstream crates may implement trait `Foo` for type `&_`

Я не планирую превращать эту часть функциональности в другие ящики. Я попробовал:

  • перемещение этого кода в двоичный ящик, который, очевидно, нельзя использовать из других ящиков
  • переместить это в приват mod
  • маркировка черты как pub(crate)

все безуспешно.

Есть ли способ дать компилятору намек на то, что ему должно быть все равно, что кто-нибудь реализует Foo для какой-либо ссылки?

Может быть, мой игрушечный пример не самый лучший, так что вот реальный код. Он используется для интеграции с частью C моей программы, поэтому немного сложный.

impl<T: MyTrait> MyFrom<Option<T>> for *mut c_void {
    fn my_from(x: Option<T>) -> Self {
        match x {
            Some(x) => <T>::alloc_heap_for(x),
            None => ptr::null_mut(),
        }
    }
}

impl<'a, T: MyTrait> MyFrom<Option<&'a T>> for *mut c_void {
    fn my_from(x: Option<&'a T>) -> Self {
        match x {
            Some(x) => x as *const T as *mut c_void,
            None => ptr::null_mut(),
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...