/* 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 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();
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
C++_Templates_The_Complete_Guide_book_code.zip (254个子文件)
namedtmpl.cpp 3KB
types.cpp 2KB
countingptrtest.cpp 2KB
tracertest.cpp 2KB
functorops.cpp 2KB
staticpoly.cpp 2KB
dynapoly.cpp 2KB
stack6test.cpp 2KB
stack8test.cpp 2KB
funcwrap.cpp 2KB
accum8.cpp 1KB
stack7test.cpp 1KB
compose5.cpp 1KB
funcptr.cpp 1KB
max3.cpp 1KB
unruh.cpp 1KB
tuple1.cpp 1KB
max2.cpp 1KB
stack5test.cpp 1KB
compose4.cpp 1KB
compose3.cpp 1KB
isclasst.cpp 1KB
stack4test.cpp 1KB
elementtype.cpp 1KB
stack3test.cpp 1KB
max3a.cpp 1KB
exprmain.cpp 1KB
compose1.cpp 1KB
compose2.cpp 1KB
stack2test.cpp 1KB
stack1test.cpp 1KB
virtual.cpp 1KB
functor1.cpp 1KB
printmax.cpp 1KB
accum6.cpp 1KB
accum5.cpp 1KB
accum9.cpp 1KB
lazy.cpp 1KB
accum3.cpp 1KB
accum2.cpp 1KB
accum4.cpp 1KB
accum1.cpp 1KB
max4.cpp 1KB
rparam2.cpp 1KB
duo5.cpp 1KB
functordemo.cpp 1KB
accum7.cpp 1001B
addvaltest.cpp 1000B
ebco1.cpp 976B
adl.cpp 973B
max.cpp 961B
bindtest.cpp 954B
ebco2.cpp 935B
testcounter.cpp 935B
max.cpp 907B
sqrt2.cpp 905B
sqrt1.cpp 905B
refnonref.cpp 886B
max5.cpp 868B
sqrt4.cpp 866B
sqrt3.cpp 866B
type1test.cpp 865B
compose6.cpp 860B
rparam1.cpp 858B
max6.cpp 851B
truletest.cpp 845B
holdertest.cpp 816B
inject.cpp 814B
loop2.cpp 808B
loop1.cpp 804B
sizeof.cpp 768B
implicit.cpp 764B
sarray2.cpp 759B
nontmpl.cpp 756B
myfirst3.cpp 751B
fppm.cpp 736B
apply1.cpp 736B
apply2.cpp 736B
myfirst.cpp 727B
promote1.cpp 713B
tracer.cpp 702B
printcolltest.cpp 683B
funcoverload.cpp 676B
duo1.cpp 669B
myfirst3main.cpp 666B
myfirst2main.cpp 666B
myfirst4main.cpp 666B
myfirstmain.cpp 665B
empty.cpp 661B
pow3b.cpp 653B
pow3.cpp 652B
sarray1.cpp 649B
myfirstinst.cpp 643B
refmemtest.cpp 638B
csm1.cpp 556B
Makefile.h 3KB
typet.hpp 8KB
typet.hpp 8KB
binder5.hpp 5KB
countingptr.hpp 4KB
共 254 条
- 1
- 2
- 3
资源评论
LostSpeed
- 粉丝: 2838
- 资源: 39
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功