1 //包含头文件
2 #include <string>
3 #include <sstream>
4 #include <iomanip>
5 #include <cassert>
6 //字符串缓冲区特征
7 template<typename T> struct StringBufferTraits
8 {
9 static const char* StringBuffer(T& aInstance);
10 };
11 //字符串缓冲区特征(字符串特化)
12 template<>
13 struct StringBufferTraits<const std::string>
14 {
15 static const char* StringBuffer(const std::string& szValue)
16 {
17 return szValue.c_str();
18 }
19 };
20 //字符串缓冲区特征(字符串特化)
21 template<>
22 struct StringBufferTraits<std::string>
23 {
24 static const char* StringBuffer(std::string& szValue)
25 {
26 return szValue.c_str();
27 }
28 };
29 //字符串缓冲区特征(字符串特化)
30 template<>
31 struct StringBufferTraits<const char*>
32 {
33 static const char* StringBuffer(const char* pszValue)
34 {
35 return pszValue;
36 }
37 };
38 //字符串缓冲区特征(字符串特化)
39 template<>
40 struct StringBufferTraits<char*>
41 {
42 static const char* StringBuffer(char* pszValue)
43 {
44 return pszValue;
45 }
46 };
47 //缓冲区特征(可变字符串数组偏特化>
48 template<size_t N>
49 struct StringBufferTraits<char [N]>
50 {
51 static const char* StringBuffer(char (&szValue)[N]) { return szValue;}
52 };
53 //缓冲区特征(常量字符串数组偏特化>
54 template<size_t N>
55 struct StringBufferTraits<const char [N]>
56 {
57 static const char* StringBuffer(const char (&szValue)[N]) { return szValue;}
58 };
59 //字符串缓冲区特征(整数特化)
60 template<>
61 struct StringBufferTraits<int>
62 {
63 static const char* StringBuffer(int nValue)
64 {
65 std::stringstream ss;
66 ss << nValue;
67 static std::string szValue;
68 szValue = ss.str();
69 return szValue.c_str();
70 }
71 };
72 //字符串缓冲区特征(整数特化)
73 template<>
74 struct StringBufferTraits<double>
75 {
76 static const char* StringBuffer(double nValue)
77 {
78 std::stringstream ss;
79 ss << std::setprecision(12) << nValue;
80 static std::string szValue;
81 szValue = ss.str();
82 return szValue.c_str();
83 }
84 };
85
86 //**********************************************************************
87 // 类名: CMyClass
88 // 目的: 自定义类
89 //*********************************************************************
90 class CMyClass
91 {
92 ////基本查询
93 public:
94 //得到名称
95 const std::string& GetName(void) const {return m_szName;}
96 //得到值
97 const std::string& GetValue(void) const {return m_szValue;}
98 ////命令
99 public:
100 //设置属性
101 template<typename NameType,typename ValueType>
102 void SetAttribute(NameType& aName,ValueType aValue)
103 {
104 const char* pszName = StringBufferTraits<NameType>::StringBuffer(aName);
105 const char* pszValue = StringBufferTraits<ValueType>::StringBuffer(aValue);
106 m_szName = pszName;
107 m_szValue = pszValue;
108 }
109 ////数据成员
110 private:
111 std::string m_szName;
112 std::string m_szValue;
113 };
114 //**********************************************************************
115 // 类名: TypeTraits
116 // 目的: 类型特征
117 //*********************************************************************
118 template<typename T>
119 struct TypeTraits
120 {
121 typedef T value_type;
122 typedef T* pointer_type;
123 typedef const T* const_pointer_type;
124 typedef T& reference_type;
125 typedef const T& const_reference_type;
126 typedef reference_type result_reference_type;
127 enum{is_const = false};
128 static result_reference_type GetValueReference(T& aInstance)
129 {
130 return aInstance;
131 }
132 };
133 //**********************************************************************
134 // 类名: TypeTraits
135 // 目的: 类型特征
136 //*********************************************************************
137 template<typename T>
138 struct TypeTraits<const T>
139 {
140 typedef T value_type;
141 typedef T* pointer_type;
142 typedef const T* const_pointer_type;
143 typedef T& reference_type;
144 typedef const T& const_reference_type;
145 typedef const_reference_type result_reference_type;
146 enum{is_const = true};
147 static result_reference_type GetValueReference(const T& aInstance)
148 {
149 return aInstance;
150 }
151 };
152 //**********************************************************************
153 // 类名: TypeTraits
154 // 目的: 类型特征
155 //*********************************************************************
156 template<typename T>
157 struct TypeTraits<T*>
158 {
159 typedef T value_type;
160 typedef T* pointer_type;
161 typedef const T* const_pointer_type;
162 typedef T& reference_type;
163 typedef const T& const_reference_type;
164 typedef reference_type result_reference_type;
165 enum{is_const = false};
166 static result_reference_type GetValueReference(T* pInstance)
167 {
168 return *pInstance;
169 }
170 };
171 //**********************************************************************
172 // 类名: TypeTraits
173 // 目的: 类型特征
174 //*********************************************************************
175 template<typename T>
176 struct TypeTraits<const T*>
177 {
178 typedef T value_type;
179 typedef T* pointer_type;
180 typedef const T* const_pointer_type;
181 typedef T& reference_type;
182 typedef const T& const_reference_type;
183 typedef const_reference_type result_reference_type;
184 enum{is_const = true};
185 static result_reference_type GetValueReference(const T* pInstance)
186 {
187 return *pInstance;
188 }
189 };
190 //**********************************************************************
191 // 函数: CMyClass_Command_Test
192 // 功能: 命令测试
193 //*********************************************************************
194 template<typename T,bool bConst>
195 struct CMyClass_Command_Test
196 {
197 void operator()(T& aInstance)
198 {
199 }
200 };
201 //**********************************************************************
202 // 函数: CMyClass_Command_Test
203 // 功能: 命令测试
204 //*********************************************************************
205 template<typename T>
206 struct CMyClass_Command_Test<T,false>
207 {
208 void operator()(T& aInstance)
209 {
210 //得到对象引用(可变或者不可变)
211 typedef TypeTraits<T> traits_type;
212 typedef typename traits_type::result_reference_type result_reference_type;
213 result_reference_type aRefInstance = traits_type::GetValueReference(aInstance);
214 //声明变量
215 const char* pszName = "name";
216 const char szaName[] = "name";
217 std::string szName("name");
218 const char* pszValue = "zs";
219 const char szaValue[] = "zs";
220 std::string szValue("zs");
221 //测试用例1: 名称变化
222 aRefInstance.SetAttribute("name",pszValue);
223 aRefInstance.SetAttribute(pszName,pszValue);
224 aRefInstance.SetAttribute(szaName,pszValue);
225 aRefInstance.SetAttribute(szName,pszValue);
226 //测试用例2: 值变化
227 aRefInstance.SetAttribute("name","zs");
228 aRefInstance.SetAttribute(pszName,pszValue);
229 aRefInstance.SetAttribute(szaName,szaValue);
230 aRefInstance.SetAttribute(szName,szValue);
231 //测试用例3: 名、值变化
232 aRefInstance.SetAttribute(szName,"zs");
233 aRefInstance.SetAttribute(szaName,pszValue);
234 aRefInstance.SetAttribute(pszName,szaValue);
235 aRefInstance.SetAttribute("name",szValue);
236 //扩展测试4: 值为其他类型
237 aRefInstance.SetAttribute(szName,123);
238 aRefInstance.SetAttribute(szName,123.45657);
239 }
240 };
241 //**********************************************************************
242 // 函数: CMyClass_Test
243 // 功能: 自定义类测试
244 //*********************************************************************
245 template<typename T>
246 void CMyClass_Test(T& aInstance)
247 {
248 //得到对象引用(可变或者不可变)
249 typedef TypeTraits<T> traits_type;
250 typedef typename traits_type::result_reference_type result_reference_type;
251 result_reference_type aRefInstance = traits_type::GetValueReference(aInstance);
252 //测试用例1: 执行查询
253 aRefInstance.GetName();
254 aRefInstance.GetValue();
255 //测试用例2: 命令
256 CMyClass_Command_Test<T,traits_type::is_const>()(aInstance);
257 }
258 //**********************************************************************
259 // 函数: main
260 // 功能: 应用程序入口
261 //*********************************************************************
262 int main(void)
263 {
264 //声明变量
265 CMyClass aTempInstance;
266 CMyClass& aInstance = aTempInstance;
267 CMyClass* pInstance = &aInstance;
268 const CMyClass& aConstInstance = aInstance;
269 const CMyClass* pConstInstance = &aConstInstance;
270 //执行四种类型的测试
271 CMyClass_Test(aInstance);
272 CMyClass_Test(pInstance);
273 CMyClass_Test(aConstInstance);
274 CMyClass_Test(pConstInstance);
275 //返回
276 return 0;
277 }