Skip to content
This repository was archived by the owner on Aug 16, 2024. It is now read-only.

Commit 89872bb

Browse files
authored
Merge pull request #80 from cyanray/dev/cyanray
提升 MessageChain 的易用性.
2 parents 63bfbe5 + a8837e5 commit 89872bb

File tree

2 files changed

+37
-11
lines changed

2 files changed

+37
-11
lines changed

include/mirai/defs/message_chain.hpp

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,33 @@ namespace Cyan
3434
typedef vector<std::shared_ptr<IMessage>>::iterator iterator;
3535

3636
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+
3944
MessageChain();
4045
MessageChain(const MessageChain& mc);
4146
MessageChain(MessageChain&& mc) noexcept;
4247
MessageChain& operator=(const MessageChain& mc);
4348
MessageChain& operator=(MessageChain&& mc) noexcept;
4449
MessageChain& operator+(const MessageChain& mc);
4550
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+
4764
bool operator==(const MessageChain& mc) const;
4865
bool operator!=(const MessageChain& mc) const;
4966
std::shared_ptr<IMessage> operator[](int i);
@@ -117,6 +134,11 @@ namespace Cyan
117134
return messages_.size();
118135
}
119136

137+
bool Empty() const
138+
{
139+
return Count() == 0;
140+
}
141+
120142
void Clear()
121143
{
122144
messages_.clear();
@@ -218,8 +240,18 @@ namespace Cyan
218240
vector<std::shared_ptr<IMessage>> messages_;
219241
};
220242

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)
223255
{
224256
mc.messages_.insert(mc.messages_.begin(), std::make_shared<PlainMessage>(str));
225257
return mc;
@@ -230,7 +262,6 @@ namespace Cyan
230262
mc.messages_.insert(mc.messages_.begin(), std::make_shared<PlainMessage>(str));
231263
return mc;
232264
}
233-
234265
}
235266

236267

src/message_chain.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,6 @@ namespace Cyan
6666
return this->Plain(val);
6767
}
6868

69-
MessageChain& MessageChain::operator+=(const string& val)
70-
{
71-
return this->Plain(val);
72-
}
73-
7469
bool MessageChain::operator==(const MessageChain& mc) const
7570
{
7671
if (this->messages_.size() != mc.messages_.size()) return false;

0 commit comments

Comments
 (0)