///////////////////////////////////////////////////////////////// // VariadicClassTemplates.cpp - demonstrates variadic mixins // // // // Jim Fawcett, CSE687 - Object Oriented Design, Spring 2018 // ///////////////////////////////////////////////////////////////// #include class A { public: A() {} A(const A& a) { std::cout << "\n an A here"; } virtual ~A() {} }; class B { public: B() {} B(const B& b) { std::cout << "\n a B here"; } virtual ~B() {} }; class C { public: C() {} C(const C& c) { std::cout << "\n a C here"; } virtual ~C() {} void do_C_op() { std::cout << "\n doing C's operation"; } }; template class D : public Mixins... { public: D(const Mixins&... mixins) : Mixins(mixins)... {} virtual ~D() {} void say() { std::cout << "\n class D with mixins here"; //std::cout << "\n " << typeid(this).name(); //std::cout << "\n " << typeid(this).raw_name(); C* pC = dynamic_cast(this); if (pC) pC->do_C_op(); std::cout << "\n"; } }; int main() { std::cout << "\n Demonstrating variadic template classes"; std::cout << "\n =========================================\n"; A a; B b; C c; D<> d; d.say(); D dA(a); dA.say(); D dBC(b, c); dBC.say(); std::cout << "\n\n"; return 0; }