You can use a slightly different design to reach the same goals on stable Rust no less
The main idea here is that you can use associated types to ensure that two traits are disjoint (the same type can't implement both traits). Then you can use the fact that if two different impls have different generic parameters (i.e. MyMainTraitHelper<SimpleType>
vs MyMainTraitHelper<ComplexType>
), then they don't conflict to create multiple blanket impls.
The main downside is that it's more complex to implement, but fortunately, most of that complexity can be hidden away.
It would be nice if this RFC was revived: Disjointness based on associated types. by withoutboats · Pull Request #1672 · rust-lang/rfcs · GitHub