On Wednesday, 22 October 2025 at 14:40:58 UTC, H. S. Teoh wrote:
The user-facing function signature should describe the
*logical* API, rather than implementation details such as "if
input is a float, if input is an enum, ..." ad nauseaum.
Logically, std.conv.to is supposed to accept *all* types (even
if the current implementation may or may not accept
*everything*), so the function signature should be:
T to(T,U)(U data) { ... }
*without* any signature constraints. All the stuff like "if U
is floating-point, if U is enum, if U is struct, ...", etc.,
are implementation details, that should be left to static if's
inside the function body rather than clutter the API with an
incomprehensibly large overload set.
In the specific case of `std.conv.to`, the user-facing template
*is* unconstrained. Its signature is:
template to(T)
However, the internal function that `to` forwards to, `toImpl`,
does use template constraints to create an incomprehensible
overload set.