How can I enforce equality of two associated type

2020-04-10 02:53发布

I have a function f which takes two arguments of the same type, and a function g which takes two arguments of different types, but both types have to store the same value, so that g can call f with the values contained in the arguments to f. I currently implemented something like this:

fn f<T>(a: T, b: T) {}

trait A {
    type A;
    fn getter(&self) -> Self::A;
}

fn g<T: A, U: A>(a: T, b: U) {
    f(a.getter(), b.getter())
}

What do I have to add to the definition of g to make it work?

2条回答
狗以群分
2楼-- · 2020-04-10 03:47

A where clause works fine:

fn g<T, U>(a: T, b: U)
where
    T: A,
    U: A<A = T::A>, // where T::A is equal to B::A
{
    f(a.getter(), b.getter())
}
查看更多
地球回转人心会变
3楼-- · 2020-04-10 03:55

I found a solution. It's not done by a where clause, but this way:

fn g<T: A, U: A<A = T::A>>(a: T, b: U) { // where T::A is equal to B::A
    f(a.getter(), b.getter())
}
查看更多
登录 后发表回答