This avoids instantiating multiple classes, reducing compile times. This patch also introduces `__underyling_type_t` for internal use, similar to other type traits.