What is wrong with that syntax?
template<typename T>
void F(T p) { ... } template<SomeConstraint T>
void F(T p) { ... }
or just void F(SomeConstraint auto p) { ... }
like this for instance: https://gcc.godbolt.org/z/hPM38TGenerics in Go are vastly different than templates in C++. They might be used for similar things, but whereas Go's generics actually build up on Go's structural typing, templates are ... something completely different again.
I mean; C++ templates are Turing complete. They are in the same ballpark as Scala's type machinery. And I say that with adoration.
that's not a very high milestone to achieve. Even java generics are turing complete (https://arxiv.org/abs/1605.05274)
The older I get, the more icky I find subtyping. It just makes things messy...