⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 namedtmpl.cpp

📁 C++ Templates 完全导引范例
💻 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 + -