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