What happens when both overloads of `serialize` are visible and you call `serialize(42)` where 42 is an int?
template <typename T>
std::enable_if_t<std::is_integral_v<T>, void>
serialize(T) { /* (A) integral */ }
template <typename T>
std::enable_if_t<std::is_floating_point_v<T>, void>
serialize(T) { /* (B) float */ }