📄 namedtmpl.cpp
字号:
/* The following code example is taken from the book * "C++ Templates - The Complete Guide" * by David Vandevoorde and Nicolai M. Josuttis, Addison-Wesley, 2002 * * (C) Copyright David Vandevoorde and Nicolai M. Josuttis 2002. * Permission to copy, use, modify, sell and distribute this software * is granted provided this copyright notice appears in all copies. * This software is provided "as is" without express or implied * warranty, and with no claim as to its suitability for any purpose. */#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 oncetemplate <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 policiesclass DefaultPolicy1 {};class DefaultPolicy2 {};class DefaultPolicy3 { public: static void doPrint() { std::cout << "DefaultPolicy3::doPrint()\n"; }};class DefaultPolicy4 {};// define default policies as P1, P2, P3, P4class 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 onceclass DefaultPolicyArgs : virtual public DefaultPolicies {};// class templates to override the default policy valuestemplate <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 valuestemplate <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 policyclass CustomPolicy { public: static void doPrint() { std::cout << "CustomPolicy::doPrint()\n"; }};int main(){ BreadSlicer<> bc1; bc1.print(); BreadSlicer<Policy3_is<CustomPolicy> > bc2; bc2.print();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -