рдХрдореНрдкреНрдпреВрдЯрд░ рд╕рд╛рдЗрдВрд╕ рдореЗрдВ рдореИрд╕реЗрдЬрд┐рдВрдЧ рдПрдХ рдХрд╛рдлреА
рдореМрд▓рд┐рдХ рдЪреАрдЬ рд╣реИред рд╣рдо рдЗрд╕реЗ рдЗрд╡реЗрдВрдЯ-рд╕рдВрдЪрд╛рд▓рд┐рдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (
рдЗрд╡реЗрдВрдЯ-рд╕рдВрдЪрд╛рд▓рд┐рдд ) рдХреЗ рдХрд░реАрдм
рдорд╛рдиреЗрдВрдЧреЗ ред рд╢рдмреНрджрд╛рд╡рд▓реА, рдХреНрд╖рдорддрд╛рдПрдВ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ: рдИрд╡реЗрдВрдЯ (
рдИрд╡реЗрдВрдЯ ), рд╕рдВрджреЗрд╢ (
рд╕рдВрджреЗрд╢ ), рд╕рд┐рдЧреНрдирд▓ / рд╕реНрд▓реЙрдЯ (
рд╕рд┐рдЧреНрдирд▓ / рд╕реНрд▓реЙрдЯ ) рдФрд░
рдХреЙрд▓рдмреИрдХ ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдШрдЯрдирд╛ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддреА рд╣реИред
рд▓реЗрдЦ рдореЗрдВ рдореИрд╕реЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реНрд╡рдпрдВ рд▓рд┐рдВрдХ / рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рдирд┐: рд╢реБрд▓реНрдХ рд▓реЗрдХрд┐рди рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреЛрдб рд╕рд░рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдореА рдкреНрд░рдгрд╛рд▓реА рддреБрдЪреНрдЫ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрджреЗрд╢ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддреА рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддреА рд╣реИред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣реИрдВрдбрд▓рд░ рдиреЙрдирд╡реЗрдЬ рд╣реИрдВ, рдФрд░ рдХреБрдЫ рд╕рдВрджреЗрд╢ рд╣реИрдВред рдФрд░ рдпрд╣ рдХрд┐ рд╣рдо рд╕реНрд╡рдпрдВ рд╕рдВрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡реЗ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рд╕рдВрджреЗрд╢ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдШреЛрд╖рдгрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
StringMessage* str_message = ...; send(my_message); ... void handle_message(const Message* message) { assert(message); const StringMessage* str_message = dynamic_cast<const StringMessage*>(message); assert(str_message); std::cout << str_message->message ... }
рд▓реЗрдХрд┐рди рдореИрдВ рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рдХреЛ рд╣рдЯрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХрд╛рдо рдХреЗ рддрд░реНрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ, рд╣реБрдб рдХреЗ рдиреАрдЪреЗред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕реВрдЪрдХ рдХреЛ рд▓рд┐рдВрдХ рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ, рдпрд╣ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рди рдХрд┐
Null nullptrред рдФрд░ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЙрд╕ рд╕рдВрджреЗрд╢ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рддреБрд░рдВрдд рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рджреЗрдВ рдЬреЛ рдЙрд╕реЗ рдЪрд╛рд╣рд┐рдПред
void handle_message(const StringMessage& message) { ... }
рд╣рдорд╛рд░реА рдпреЛрдЬрдирд╛ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдФрд░ рдЕрдиреНрдп рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрджреЗрд╢ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ?
рд╡рд┐рдЪрд╛рд░ рд╕рд░рд▓ рд╣реИред рд╣реИрдВрдбрд▓рд░ рдХреЗ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди, рд╣рдо рддрд░реНрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реИред рдФрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬрддреЗ рд╕рдордп, рд╣рдо рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рдХрд╛рд░ рд╣реИрдВрдбрд▓рд░ рддрд░реНрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдирдП рд╕рдВрджреЗрд╢ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ
Message
рд╕рдВрджреЗрд╢ рдХреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред
class Message{ public: Message(unsigned code) : code(code) {} virtual ~Message() {} const unsigned code; }; enum Code { STRING = 1 }; class StringMessage : public Message { public: StringMessage(const std::string& msg) : Message(STRING), message(msg) {} const std::string message; };
рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдгрдп
рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ C ++ 03 рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рд╡рд░реНрдгрди рдпрд╣рд╛рдБ рд╣реИрдмреЗ рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛
рд╣реИ ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗрд╡рд▓ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЖрд╡рд░рдг рд╣реИрдВред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣реИрдВрдбрд▓рд░ рд╕рджрд╕реНрдпрддрд╛ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред
class Messenger { ... template <class T, class MessageDerived> void subscribe(int code, T* object, void (T::* method)(const MessageDerived&)) {
рд╢реБрджреНрдзрддрд╛ред рдЬреИрд╕реЗ рд╣реА рд╡реНрдпреБрддреНрдкрдиреНрди рд╕рдВрджреЗрд╢ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдХрд░рдг рдХрдо рддреБрдЪреНрдЫ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ,
рд╡рд╕реНрддреБрдУрдВ рдХреЛ
рдЯреНрд░рд┐рдо рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИред рдЬрдм рдЖрдк рднреЗрдЬрдиреЗ рдХреА рд╡рд┐рдзрд┐ рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рд╕рдВрджрд░реНрдн рдХреЛ рд╢рд┐рдлреНрдЯ рдХрд░рдХреЗ рдмреЗрд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЫреЛрдЯрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рд╡рд╣ рдПрдХ рдЕрдорд╛рдиреНрдп рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд╕реНрддреБ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдЖрдкрдХреЛ рд╕реВрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗред
template <class Base, class Derived> bool is_sliced(const Derived* der) { return (void*) der != (const Base*) der; }
рд▓реЗрдХрд┐рди рдПрдХ рд╕рдВрдХрд▓рди рд╕рдордп рдХреА рдЬрд╛рдВрдЪ рд▓рд┐рдЦрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рд╕рдВрдХрд▓рдХ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдЖрдзрд╛рд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЯреБрдХрдбрд╝рд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдЕрдЧрд░ рд╕реВрдЪрдХ 1 рд╕реЗ рдмрдврд╝ рдЧрдпрд╛, рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
template <class Base, class Derived> struct is_sliced2 : public std::integral_constant<bool, ((void*)((Base*)((Derived*) 1))) != (void*)1> {}; ... static_assert(!is_sliced2<Message, Arg>::value, "Message object should not be sliced");
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, MSVS 2013 рд╕рдВрдХрд▓рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди gcc-4.8.1 рдареАрдХ рд╣реИред
рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рд╕рдВрджреЗрд╢ рдЫреЛрдЯрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдо рд╕рднреА рд╣реИрдВрдбрд▓рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВред рдпрджрд┐ рд╕рдВрджреЗрд╢ рдХреЛрдб рдФрд░ рд╣реИрдВрдбрд▓рд░ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЕрдиреБрдкрд╛рд▓рди рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред рдЕрдЧрд░ рд╕рдм рдХреБрдЫ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдмреБрд▓рд╛рдУред
рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ class Messenger { ... template <class LikeMessage> void send(const LikeMessage& msg) { assert((!is_sliced<Message, LikeMessage>(&msg))); send_impl(msg); } private: void send_impl(const Message& msg) { const std::type_info& arg = typeid(msg);
рд╕рддреНрдпрд╛рдкрди рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐
MessageDerived
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ
Message
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред C ++ 11 рдореЗрдВ,
<type_traits>
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ
std::is_base_of
ред C ++ 03 рдореЗрдВ, рдЖрдкрдХреЛ рд╣рд╛рде рд╕реЗ рд╕рдВрдХрд▓рди рд╕рдордп рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдЙрджрд╛рд╣рд░рдг рд╕рд░рд▓ рд╣реИред рд╣реИрдВрдбрд▓рд░ рд╡рд░реНрдЧ, рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╕рджрд╕реНрдпрддрд╛, рдФрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛:
class Printer { public: void print(const StringMessage& msg) { std::cout << "Printer received: " << msg.message << std::endl; } }; int main() { Messenger messenger; Printer print; messenger.subscribe(STRING, &print, &Printer::print); messenger.send(StringMessage("Hello, messages!")); return 0; }
рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдбC ++ 11
рд▓реИрдореНрдмреНрдбрд╛ рд╕реА ++ 11 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдПред рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рд╕рджрд╕реНрдпрддрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдмрдирд╛рдирд╛ рд╣реИ:
messenger.subscribe(STRING, [](const StringMessage& msg) {...});
рдЖрдк ldda рдХреЛ
std::function
рдореЗрдВ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрдирдкреБрдЯ рддрд░реНрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЦреЛрдП рдмрд┐рдирд╛ рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдлрд┐рд░ lambda рдХреЛ рдХреБрдЫ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдЬреИрд╕реЗ
std::function<void (const Message&)>
ред рд▓реЗрдХрд┐рди рдЖрдк рдХреЗрд╡рд▓ C ++ рдХреЗ рд▓рдВрдмреЛрджрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ template <typename Function> struct function_traits : public function_traits<decltype(&Function::operator())> {}; template <typename ClassType, typename ReturnType, typename... Args> struct function_traits<ReturnType(ClassType::*)(Args...) const> { typedef ReturnType (*pointer)(Args...); typedef std::function<ReturnType(Args...)> function; };
рдпрд╣рд╛рдВ рд╕реЗ рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛
рдЧрдпрд╛ ред рдПрдХ рдЕрддреБрд▓рдиреАрдп, рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдЪреАрдЬрд╝, рдФрд░ рдПрдХ рдЖрдВрд╢рд┐рдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд╕рд╛рде рднреА! рд▓реЗрдХрд┐рди рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд▓реИрдореНрдмреНрдбрд╛ рдореЗрдВ рдПрдХ
operator()
, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
decltype(&Function::operator())
рдпрд╣
decltype(&Function::operator())
рдЕрдиреБрд░реВрдк рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдлреИрд▓рддрд╛ рд╣реИред рддрд░реНрдХреЛрдВ рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╛рдирд╛рд░реНрдердХ рд╢рдмреНрдж рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди
std::function
ред
рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╕рдорд╛рди рд╣реИред рдХреЗрд╡рд▓ рд▓рдВрдмреЛрджрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реНрдХ рдЬрдЯрд┐рд▓ рд╣реИред
template <typename Function> class Messenger { ... void subscribe(int code, Function func) {
In_function_pointer рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реИ?рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдХреЛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
template <typename Function> typename function_traits<Function>::pointer to_function_pointer(Function& lambda) { return static_cast<typename function_traits<Function>::pointer>(lambda); }
рдЯрд┐рдкреНрдкрдгреАрдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдХрд▓рд╛рдХрд╛рд░реЛрдВ рдХреЛ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдмрдирд╛рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред
std::function<void (const Message&)> msg_func = ...; std::function<void (const StringMessage&)> str_func = msg_func;
рдпрд╣ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рд░рд┐рд╢реНрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ,
StringMessage
Message
ред рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдирд╣реАрдВред
рднреЗрдЬрдиреЗ рдХрд╛ рдХреЛрдб рд▓рдЧрднрдЧ рд╢рдмреНрджрд╢рдГ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдкрд╛рд░реНрд╕ рдХреЛрдб рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИред
рд╕рднреА рдХреЛрдб рд▓рдВрдмреЛрджрд░ рдХреЗ рд╕рд╛рде ред
рдпрд╣рд╛рдВ рд╣рдорд╛рд░рд╛ рдХрд╛рдо рдЦрддреНрдо рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЖрдк рдмрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
int main() { Messenger messenger; messenger.subscribe(STRING, [](const StringMessage& msg) { std::cout << "Received: " << msg.message << std::endl; }); messenger.send(StringMessage("Hello, messages!")); return 0; }
рдореИрдВ рдХрдИ рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП
рдХреЙрд▓рдмреИрдХ рдХреЗ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдПрдХ рд▓реЗрдЦ рдХрд╛ рд▓рд┐рдВрдХ рднреА рдкреНрд░рджрд╛рди рдХрд░реВрдВрдЧрд╛ред
рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ
рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рддрдирд╛ рдбреВрдм рдЧрдпрд╛ рд╣реИред рдЪрд▓реЛ рджреЛ
рддреНрд╡рд░рд┐рдд рджреВрддреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╣реИрдВрдбрд▓рд░ рд▓реЗрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рд╣рдорд╛рд░рд╛ рд╣реИ рдФрд░
Message
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рджреВрд╕рд░рд╛ рд╡рд╣ рдЬреЛ рдХреЗрд╡рд▓
StringMessage
рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдПрдХ рд╕реНрдерд╛рдкрд┐рдд рд╕рдВрджреЗрд╢
рдХрдИ 500 рдорд┐рд▓рд┐рдпрди рдмрд╛рд░ рднреЗрдЬреЗрдВрдЧреЗред
Msg: 13955ms Str: 1176ms Ratio: 12.0
12 рдмрд╛рд░ рдзреАрдорд╛ред рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдФрд░ рдЯрд╛рдЗрдк рдорд┐рд▓рд╛рди рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╕рдордп рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдЯрд╛рдЗрдк рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЖрдВрдХрдбрд╝рд╛ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд╣реИ, рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рд░рдЦреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдПрдХ рдЕрдбрд╝рдЪрди рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЙрдирдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреАред рдФрд░ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк рд░рд┐рд▓реАрдЬрд╝ рдореЛрдб рдореЗрдВ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЪреЗрдХрд┐рдВрдЧ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рджрд░реНрд╢рди рдХреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдорд╛рдк рдХреЛрдбрдореИрдВ рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЪреБрдк рд░рд╣рд╛рдореИрдВрдиреЗ рдореЗрдордиреЗ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╣рдордиреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд░рдЦрд╛ рдФрд░ рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдореБрдЭреЗ рдЕрдиреНрдп рдЙрдкрд╛рдп рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рд╕рд┐рд╡рд╛рдп рдЙрд╕реА рдХреЗ рдФрд░ рд╕рдмреНрд╕реНрдХреНрд░рд┐рдкреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕рдмреНрд╕реНрдХреНрд░рд┐рдкреНрд╢рди рдореЗрдердб рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдПред
рдкрд░рд┐рдгрд╛рдо
рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдФрд░ рдХрд╛рдлреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореИрд╕реЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдорд┐рд▓рд╛ред рд╕рднреА рдХреЛрдб
GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз
рд╣реИ ред