traits 技法

C++语言: Codee#25861
001 #include <iostream>
002 using namespace std;
003
004 /*
005     traits 技术
006     将某种类型相关联的所有申明绑定在一起的实现方式
007     可以以灵活的方法从它们中的语境中将这些的类型和值进行“混合与匹配”
008     chm按:在stl的源码中多见此技术的使用,Hjj 先生将其视为一种重要的技术
009 */
010 class Milk
011 {
012 public :
013     friend ostream & operator <<( ostream & os , const Milk &)
014     {
015         return os << "Milk";
016     }
017 };
018
019 class CondensedMilk
020 {
021 public :
022     friend ostream &
023     operator <<( ostream & os , const CondensedMilk &)
024     {
025         return os << "Condensed Milk";
026     }
027 };
028
029 class Honey
030 {
031 public :
032     friend ostream & operator <<( ostream & os , const Honey &)
033     {
034         return os << "Honey";
035     }
036 };
037
038 class Cookies
039 {
040 public :
041     friend ostream & operator <<( ostream & os , const Cookies &)
042     {
043         return os << "Cookes";
044     }
045 };
046
047 class Bear
048 {
049 public :
050     friend ostream & operator <<( ostream & os , const Bear &)
051     {
052         return os << "Theodore";
053     }
054 };
055
056 class Boy
057 {
058 public :
059     friend ostream & operator <<( ostream & os , const Boy &)
060     {
061         return os << "Patrick";
062     }
063 };
064
065 template < class Guest >
066 class GuestTraits;
067
068 template <>
069 class GuestTraits < Bear >
070 {
071 public :
072     typedef CondensedMilk beverage_type;
073     typedef Honey snack_type;
074 };
075
076 template <> class GuestTraits < Boy >
077 {
078 public :
079     typedef Milk beverage_type;
080     typedef Cookies snack_type;
081 };
082
083 class MixedUpTraits
084 {
085 public :
086     typedef Milk beverage_type;
087     typedef Honey snack_type;
088 };
089
090 template < class Guest , class traits = GuestTraits < Guest > >
091 class BearCorner
092 {
093     Guest theGuest;
094     typedef typename traits :: beverage_type beverage_type;
095     typedef typename traits :: snack_type snack_type;
096     beverage_type bev;
097     snack_type snack;
098 public :
099     BearCorner( const Guest & g)
100         : theGuest( g)
101     {}
102     void entertain()
103     {
104         cout << "Entertaining " << theGuest
105              << " serving " << bev
106              << " and " << snack << endl;
107     }
108 };
109
110 int main()
111 {
112     Boy cr;
113     BearCorner < Boy > pc1( cr);
114     pc1 . entertain();
115
116     Bear pb;
117     BearCorner < Bear > pc2(pb);
118     pc2 . entertain();
119     BearCorner < Bear , MixedUpTraits > pc3(pb);
120     pc3 . entertain();
121
122     return 0;
123 }
124 /*
125 Entertaining Patrick serving Milk and Cookes
126 Entertaining Theodore serving Condensed Milk and Honey
127 Entertaining Theodore serving Milk and Honey
128
129 Process returned 0 (0x0)   execution time : 0.071 s
130 Press any key to continue.
131 */

转载于:https://www.cnblogs.com/invisible/archive/2012/03/17/2403350.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值