@@ -34,16 +34,33 @@ namespace Cyan
34
34
typedef vector<std::shared_ptr<IMessage>>::iterator iterator;
35
35
36
36
friend MessageChain& operator +(const string& str, MessageChain& mc);
37
- template <int N>
38
- friend MessageChain& operator +(const char (&str)[N], MessageChain&& mc);
37
+
38
+ template <typename T>
39
+ friend MessageChain& operator +(T&& val, MessageChain& mc);
40
+
41
+ template <std::size_t N>
42
+ friend MessageChain& operator +(const char (&str)[N], MessageChain& mc);
43
+
39
44
MessageChain ();
40
45
MessageChain (const MessageChain& mc);
41
46
MessageChain (MessageChain&& mc) noexcept ;
42
47
MessageChain& operator =(const MessageChain& mc);
43
48
MessageChain& operator =(MessageChain&& mc) noexcept ;
44
49
MessageChain& operator +(const MessageChain& mc);
45
50
MessageChain& operator +(const string& val);
46
- MessageChain& operator +=(const string& val);
51
+
52
+ template <typename T>
53
+ MessageChain& operator +=(T&& val)
54
+ {
55
+ return this ->Add (std::forward<T>(val));
56
+ }
57
+
58
+ template <std::size_t N>
59
+ MessageChain& operator +=(const char (&val)[N])
60
+ {
61
+ return this ->Add <PlainMessage>(val);
62
+ }
63
+
47
64
bool operator ==(const MessageChain& mc) const ;
48
65
bool operator !=(const MessageChain& mc) const ;
49
66
std::shared_ptr<IMessage> operator [](int i);
@@ -117,6 +134,11 @@ namespace Cyan
117
134
return messages_.size ();
118
135
}
119
136
137
+ bool Empty () const
138
+ {
139
+ return Count () == 0 ;
140
+ }
141
+
120
142
void Clear ()
121
143
{
122
144
messages_.clear ();
@@ -218,8 +240,18 @@ namespace Cyan
218
240
vector<std::shared_ptr<IMessage>> messages_;
219
241
};
220
242
221
- template <int N>
222
- inline MessageChain& operator +(const char (&str)[N], MessageChain&& mc)
243
+ template <typename T>
244
+ inline MessageChain& operator +(T&& val, MessageChain& mc)
245
+ {
246
+ using real_type = typename std::remove_const<typename std::remove_reference<T>::type >::type;
247
+ static_assert (std::is_base_of<IMessage, real_type>::value, " 只能接受 IMessage 的派生类" );
248
+ std::shared_ptr<IMessage> m_ptr (new real_type (std::forward<T>(val)));
249
+ mc.messages_ .insert (mc.messages_ .begin (), m_ptr);
250
+ return mc;
251
+ }
252
+
253
+ template <std::size_t N>
254
+ inline MessageChain& operator +(const char (&str)[N], MessageChain& mc)
223
255
{
224
256
mc.messages_ .insert (mc.messages_ .begin (), std::make_shared<PlainMessage>(str));
225
257
return mc;
@@ -230,7 +262,6 @@ namespace Cyan
230
262
mc.messages_ .insert (mc.messages_ .begin (), std::make_shared<PlainMessage>(str));
231
263
return mc;
232
264
}
233
-
234
265
}
235
266
236
267
0 commit comments