Rust uses the "turbo fish" to get around this. Your example wouldn't compile unless a and b where valid variable names.
a::<b> (c)
Is how you instantiate a generic. It's not that ugly. Bigger problem is value type generics/const generics where you want to do some logic like a<b > c>