型レベルで表現しておいて、型パラメータとかに突っ込んでもっと複雑な型状態が作れたり。 勘で書いたので適当。
Type-level sum
enumの型レベル表現的なもの
enum Alphabets {
A,
B,
}
struct A;
struct B;
pub(crate) mod sealaed {
pub trait Alphabets {}
}
impl sealed::Alphabets for A {}
impl sealed::Alphabets for B {}
sealaed traitにすることで、このtraitをimplできなくなる。はず
Type-level product
structの型レベル表現的なもの
struct AlphabetsPair {
x: Alphabets,
y: Alphabets,
}
let a_and_b = AlphabetsPair {
x: Alphabets::A,
y: Alphabets::B,
};
trait AlphabetsPair {
type X: Alphabets;
type Y: Alphabets;
}
struct AandB {}
impl AlphabetsPair for AandB {
type X = A;
type Y = B;
}
fn test() {
dbg!(std::any::type_name::<<AandB as AlphabetsPair>::X>()); // A
}