import io:*; typedef NoTraits {}; typedef Trait1 (FirstTrait) {}; typedef Trait2 (SecondTrait) {}; typedef TwoTrait (FirstTrait, SecondTrait) {}; typedef AlreadySpecilized (FirstTrait, SecondTrait) {}; template |void| OneTwoFunc(|T| obj) { println("No Traits"); } template |void| OneTwoFunc(|T| obj) { println("First Trait"); } template |void| OneTwoFunc(|T| obj) { println("Second Trait"); } template |void| OneTwoFunc(|T| obj) { println("Both Traits"); } /* template |void| OneTwoFunc(|AlreadySpecilized| obj) { println("Already Specilized"); } */ //This should work for objects too! //To test, we cycle the mapping of traits typedef template OneTwoObj (FirstTrait) {}; typedef template OneTwoObj (SecondTrait) {}; typedef template OneTwoObj (FirstTrait, SecondTrait) {}; typedef template OneTwoObj {}; /* *typedef template OneTwoObj { * void proveSpecilized() { * println("I'm specilized!"); * } *}; */ |int| main() { |NoTraits| a; |Trait1| b; |Trait2| c; |TwoTrait| d; |AlreadySpecilized| e; OneTwoFunc(a); OneTwoFunc(b); OneTwoFunc(c); OneTwoFunc(d); // OneTwoFunc(e); println(); |OneTwoObj| alpha; |OneTwoObj| beta; |OneTwoObj| gamma; |OneTwoObj| delta; // |OneTwoObj| epsilon; OneTwoFunc>(alpha); OneTwoFunc>(beta); OneTwoFunc>(gamma); OneTwoFunc>(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; }