Choose Category
#include <iostream> // PolicySelector<A,B,C,D> creates A,B,C,D as base classes // - Discriminator<> allows having even the same base class more than once template <typename Base, int D> class Discriminator : public Base { }; template <typename Setter1, typename Setter2, typename Setter3, typename Setter4> class PolicySelector : public Discriminator<Setter1,1>, public Discriminator<Setter2,2>, public Discriminator<Setter3,3>, public Discriminator<Setter4,4> { }; // default policies class DefaultPolicy1 {}; class DefaultPolicy2 {}; class DefaultPolicy3 { public: static void doPrint() { std::cout << "DefaultPolicy3::doPrint()\n"; } }; class DefaultPolicy4 {}; // define default policies as P1, P2, P3, P4 class DefaultPolicies { public: typedef DefaultPolicy1 P1; typedef DefaultPolicy2 P2; typedef DefaultPolicy3 P3; typedef DefaultPolicy4 P4; }; // class to define a usage of the default policy values // - avoids ambiguities if we derive from DefaultPolicies more than once class DefaultPolicyArgs : virtual public DefaultPolicies { }; // class templates to override the default policy values template <typename Policy> class Policy1_is : virtual public DefaultPolicies { public: typedef Policy P1; // overriding typedef }; template <typename Policy> class Policy2_is : virtual public DefaultPolicies { public: typedef Policy P2; // overriding typedef }; template <typename Policy> class Policy3_is : virtual public DefaultPolicies { public: typedef Policy P3; // overriding typedef }; template <typename Policy> class Policy4_is : virtual public DefaultPolicies { public: typedef Policy P4; // overriding typedef }; // create class template with four policies and default values template <typename PolicySetter1 = DefaultPolicyArgs, typename PolicySetter2 = DefaultPolicyArgs, typename PolicySetter3 = DefaultPolicyArgs, typename PolicySetter4 = DefaultPolicyArgs> class BreadSlicer { typedef PolicySelector<PolicySetter1, PolicySetter2, PolicySetter3, PolicySetter4> Policies; // use Policies::P1, Policies::P2, //... to refer to the various policies. public: void print () { Policies::P3::doPrint(); } //... }; // define a custom policy class CustomPolicy { public: static void doPrint() { std::cout << "CustomPolicy::doPrint()\n"; } }; int main() { BreadSlicer<> bc1; bc1.print(); BreadSlicer<Policy3_is<CustomPolicy> > bc2; bc2.print(); }