Is it possible to do something like this in Rust?
trait Foo<T> {}
struct A;
struct B;
struct Bar<T: Foo> {
a: T<A>,
b: T<B>
}
I know I could just use two parameters for Bar
, but I think there has to be a better way to do this.
I want to implement a Graph
structure. As I can't just bind the nodes and edges to their parents lifetime, I want to have something like Rc
. However, sometimes one may need a Graph
with access from multiple threads. So I'd have to have both an implementation with Rc
and Arc
.
That's what Foo
is good for: I implement Foo
for both Rc
and Arc
(Foo
would require Deref
) and I use a parameter T
bound to Foo
. That's how I wanted to have one struct for single thread and multi thread usage.
You can use generic associated types (GATs) and the family pattern for that:
Then you can define two families:
And use it:
(Playground)
As you can see, it's slightly more involved than one would hope for: you can't just say
Bar<Vec>
for example, but have to go through the extra family type. But it works!For an older answer (before GATs existed) containing more general information about the topic, click here.