# Include <iostream> using namespace STD; // intermediate template <typename base, int D> class discrim: public base {public: discrim () {cout <"discrim () "<Endl ;}}; // The policyselector of the discrim class can be inherited from the same base class template multiple times <typename set1, typename set2, typename set3, typename set4> class policyselector: Public discrim <set1, 1>, public discrim <set2, 2>, public discrim <set3, 3>, public discrim <set4, 4> {}; class defaul Tpol1 {public: void print () {cout <"p1 print ()" <Endl ;}; class defaultpol2 {public: void print () {cout <"p2 print ()" <Endl ;}}; class defaultpol3 {public: void print () {cout <"P3 print () "<Endl ;}}; class defaultpol4 {public: void print () {cout <" P4 print () "<Endl ;}}; // create a default set class defaultpols {public: typedef defaultpol1 dp1; typedef defaultpol2 dp2; typedef defaultpol3 dp3; typedef defaul Tpol4 dp4 ;}; class defaultpolargs: virtual public defaultpols {}; // write several templates to overwrite the Default policy parameter // 1 template <typename Policy> class policypolicis: virtual public defaultpols {public: typedef policy dp1; virtual void print () {dp1 dd; DD. print () ;};// 2 template <typename Policy> class policy2_is: virtual public defaultpols {public: typedef policy dp2; virtual void print () {dp1 dd; DD. print () ;}}; // 3 Template <Typename Policy> class policy3_is: virtual public defaultpols {public: typedef policy dp3; policy3_is () {cout <"policy3_is ()" <Endl;} virtual void print () {dp1 dd; DD. print () ;}}; // 4 template <typename Policy> class policy4_is: virtual public defaultpols {public: typedef policy dp4; virtual void print () {dp1 dd; DD. print () ;}; // all the default values here are the same template <typename policyset1 = defaultpolargs, typename Policyset2 = defaultpolargs, typename policyset3 = defaultpolargs, typename policyset4 = defaultpolargs> class breadslicer {public: // create a selector, policyselector is initialized as the corresponding type using the template parameters here. // This specifies the parent class of yyselector, and does not inherit from its own template parameters... // The understanding of this part is not clear yet ?? Typedef policyselector <policyset1, policyset2, policyset3, policyset4> policies; void print () {typename policies: dp1 P1; p1.print (); typename policies: dp2; p2.print (); typename injection ies: dp3 P3; p3.print (); typename injection ies: dp4 P4; p4.print () ;}}; class custompolia {public: void print () {cout <"custompolia print ()" <Endl ;}}; class custompolib {public: void print () {cout <"custompolib print () "<Endl ;}; int main (INT argc, char ** argv) {breadslicer <policy3_is <custompolia>, policy4_is <custompolib> BC; BC. print (); Return 0;} starting:/home/Robert tkun/projects/tevent/build/teventp1 print () P2 print () custompolia print () custompolib print () * ** exited normally ***