1 template <class T, int... Args> struct C { 2 T member; 3 bool argsAre_16_32() { return false; } 4 }; 5 6 template <> struct C<int, 16> { 7 int member; 8 bool argsAre_16_32() { return false; } 9 }; 10 11 template <> struct C<int, 16, 32> : C<int, 16> { 12 bool argsAre_16_32() { return true; } 13 }; 14 15 template <class T, typename... Args> struct D { 16 T member; 17 bool argsAre_Int_bool() { return false; } 18 }; 19 20 template <> struct D<int, int> { 21 int member; 22 bool argsAre_Int_bool() { return false; } 23 }; 24 25 template <> struct D<int, int, bool> : D<int, int> { 26 bool argsAre_Int_bool() { return true; } 27 }; 28 29 int main(int argc, char const *argv[]) { 30 C<int, 16, 32> myC; 31 C<int, 16> myLesserC; 32 myC.member = 64; 33 (void)C<int, 16, 32>().argsAre_16_32(); 34 (void)C<int, 16>().argsAre_16_32(); 35 (void)(myC.member != 64); 36 D<int, int, bool> myD; 37 D<int, int> myLesserD; 38 myD.member = 64; 39 (void)D<int, int, bool>().argsAre_Int_bool(); 40 (void)D<int, int>().argsAre_Int_bool(); 41 42 return 0; // break here 43 } 44