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/p/2403350.html