namedtmpl.cpp

来自「非常著名的C++ Templates 完全导引范例配套的原代码」· C++ 代码 · 共 120 行

CPP
120
字号
/* 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 + =
减小字号Ctrl + -
显示快捷键?