The templates must be verifiable on their own, without consideration for particular instantiations. I.e. what happens if I tried to do?
type :: my_t
end type
instantiate add_t(T)
One of the explicit design goals was avoiding the terrible error messages of C++ templates. This is done by using “strong concepts” (i.e. type checking of the template itself). The good news is that (aside from the as_string function), you can probably reuse a lot of intrinsics. I.e.
instantiate add_t(integer, operator(+))