| template <class T, int... Args> struct C { | |
| T member; | |
| bool argsAre_16_32() { return false; } | |
| }; | |
| template <> struct C<int, 16> { | |
| int member; | |
| bool argsAre_16_32() { return false; } | |
| }; | |
| template <> struct C<int, 16, 32> : C<int, 16> { | |
| bool argsAre_16_32() { return true; } | |
| }; | |
| template <class T, typename... Args> struct D { | |
| T member; | |
| bool argsAre_Int_bool() { return false; } | |
| }; | |
| template <> struct D<int, int> { | |
| int member; | |
| bool argsAre_Int_bool() { return false; } | |
| }; | |
| template <> struct D<int, int, bool> : D<int, int> { | |
| bool argsAre_Int_bool() { return true; } | |
| }; | |
| template <typename... Args> struct OnlyPack {}; | |
| template <typename T, typename... Args> struct EmptyPack {}; | |
| int main(int argc, char const *argv[]) { | |
| EmptyPack<int> emptyPack; | |
| OnlyPack<int, char, double, D<int, int, bool>> onlyPack; | |
| C<int, 16, 32> myC; | |
| C<int, 16> myLesserC; | |
| myC.member = 64; | |
| (void)C<int, 16, 32>().argsAre_16_32(); | |
| (void)C<int, 16>().argsAre_16_32(); | |
| (void)(myC.member != 64); | |
| D<int, int, bool> myD; | |
| D<int, int> myLesserD; // breakpoint here | |
| myD.member = 64; | |
| (void)D<int, int, bool>().argsAre_Int_bool(); | |
| (void)D<int, int>().argsAre_Int_bool(); | |
| return 0; // break here | |
| } |