76 lines
1.8 KiB
Plaintext
76 lines
1.8 KiB
Plaintext
import io:*;
|
|
|
|
obj NoTraits {};
|
|
|
|
obj Trait1 (FirstTrait) {};
|
|
obj Trait2 (SecondTrait) {};
|
|
obj TwoTrait (FirstTrait, SecondTrait) {};
|
|
obj AlreadySpecilized (FirstTrait, SecondTrait) {};
|
|
|
|
fun OneTwoFunc<T>(obj: T): void {
|
|
println("No Traits");
|
|
}
|
|
|
|
fun OneTwoFunc<T(FirstTrait)>(obj: T): void {
|
|
println("First Trait");
|
|
}
|
|
|
|
fun OneTwoFunc<T(SecondTrait)>(obj: T): void {
|
|
println("Second Trait");
|
|
}
|
|
|
|
fun OneTwoFunc<T(FirstTrait, SecondTrait)>(obj: T): void {
|
|
println("Both Traits");
|
|
}
|
|
/*
|
|
template <AlreadySpecilized> |void| OneTwoFunc(|AlreadySpecilized| obj) {
|
|
println("Already Specilized");
|
|
}
|
|
*/
|
|
//This should work for objects too!
|
|
//To test, we cycle the mapping of traits
|
|
|
|
obj OneTwoObj<T> (FirstTrait) {};
|
|
obj OneTwoObj<T(FirstTrait)> (SecondTrait) {};
|
|
obj OneTwoObj<T(SecondTrait)> (FirstTrait, SecondTrait) {};
|
|
obj OneTwoObj<T(FirstTrait, SecondTrait)> {};
|
|
/*
|
|
*obj template<AlreadySpecilized> OneTwoObj {
|
|
* void proveSpecilized() {
|
|
* println("I'm specilized!");
|
|
* }
|
|
*};
|
|
*/
|
|
|
|
fun main(): int {
|
|
var a: NoTraits;
|
|
var b: Trait1;
|
|
var c: Trait2;
|
|
var d: TwoTrait;
|
|
var e: AlreadySpecilized;
|
|
|
|
OneTwoFunc<NoTraits>(a);
|
|
OneTwoFunc<Trait1>(b);
|
|
OneTwoFunc<Trait2>(c);
|
|
OneTwoFunc<TwoTrait>(d);
|
|
// OneTwoFunc<AlreadySpecilized>(e);
|
|
|
|
println();
|
|
|
|
var alpha: OneTwoObj<NoTraits>;
|
|
var beta: OneTwoObj<Trait1>;
|
|
var gamma: OneTwoObj<Trait2>;
|
|
var delta: OneTwoObj<TwoTrait>;
|
|
// |OneTwoObj<AlreadySpecilized>| epsilon;
|
|
|
|
OneTwoFunc<OneTwoObj<NoTraits>>(alpha);
|
|
OneTwoFunc<OneTwoObj<Trait1>>(beta);
|
|
OneTwoFunc<OneTwoObj<Trait2>>(gamma);
|
|
OneTwoFunc<OneTwoObj<TwoTrait>>(delta);
|
|
|
|
//We can't pass along our inner part, so let's just make sure that it is the right object.
|
|
//epsilon.proveSpecilized();
|
|
|
|
return 0;
|
|
}
|