These are not proper sum types, since you're limited to one variant per type.
I am not sure what you mean, you can definitely have e.g. an
std::variant<int, std::string, bool>
Which is a sum of those three types.
See the first IpAddr example here[1], where you have separate variants, both with string representations. You can't do this with std::variant. You have to use separate types.
I see what you mean now, thanks. To reproduce that example with std::variant I would need some kind of strong type alias, which as far as I know is missing from C++; so the only feasible way to do that would be wrapping the string in another class or struct.