æè¿ã SObjectizerã®æ°ããããŒãžã§ã³ã«åãçµãã§ããéã«ãã³ã³ãã€ã«æã«éçºè ã®ã¢ã¯ã·ã§ã³ãå¶åŸ¡ããã¿ã¹ã¯ã«çŽé¢ããŸããã äžçªäžã®è¡ã¯ã以åã¯ããã°ã©ããŒã次ã®åœ¢åŒã®åŒã³åºããè¡ãããšãã§ãããšããããšã§ããã
receive(from(ch).empty_timeout(150ms), ...); receive(from(ch).handle_n(2).no_wait_on_empty(), ...); receive(from(ch).empty_timeout(2s).extract_n(20).stop_on(...), ...); receive(from(ch).no_wait_on_empty().stop_on(...), ...);
receiveïŒïŒæäœã«ã¯ãäžèšã®from(ch).empty_timeout(150ms)
ãŸãã¯from(ch).handle_n(2).no_wait_on_empty()
ãªã©ãäžé£ã®ã¡ãœããã䜿çšãããäžé£ã®ãã©ã¡ãŒã¿ãŒãå¿
èŠã§ããã åæã«ãæœåº/åŠçãããã¡ãã»ãŒãžã®æ°ãå¶éããhandle_nïŒïŒ/ extract_nïŒïŒã¡ãœããã®åŒã³åºãã¯ãªãã·ã§ã³ã§ããã ãããã£ãŠãäžèšã®ãã§ãŒã³ã¯ãã¹ãŠæ£ãããã®ã§ããã
ããããæ°ããããŒãžã§ã³ã§ã¯ããŠãŒã¶ãŒãæœåºããã³/ãŸãã¯åŠçããã¡ãã»ãŒãžã®æ°ãæ瀺çã«æå®ããããšã匷å¶ããå¿
èŠããããŸããã ã€ãŸã from(ch).empty_timeout(150ms)
ã®ãã©ãŒã ã®ãã§ãŒã³ãæ£ããfrom(ch).empty_timeout(150ms)
ã from(ch).handle_all().empty_timeout(150ms)
ã«çœ®ãæããå¿
èŠããããŸãã
ãããŠãããã°ã©ããŒãhandle_allïŒïŒãhandle_nïŒïŒãŸãã¯extract_nïŒïŒã®åŒã³åºããå¿ããå Žåã«ã³ã³ãã€ã©ãŒãããã°ã©ããŒã®æãæã€ããã«ãããã£ãã®ã§ãã
C ++ã¯ãããå©ããããšãã§ããŸããïŒ
ã¯ã ãããŠã誰ãããŸãã«ãã®æ¹æ³ã«èå³ããããªããããªãã¯ç«ã®äžã§æè¿ãããŠããŸãã
receiveïŒïŒé¢æ°ä»¥äžã®ãã®ããããŸã
äžèšã®receiveïŒïŒé¢æ°ã¯ãåŒã³åºããã§ãŒã³ïŒ ãã«ããŒãã¿ãŒã³ãšãåŒã°ããŸã ïŒã䜿çšããŠèšå®ããããã©ã¡ãŒã¿ãŒã瀺ããŠããŸãã ããããã»ãŒåããã©ã¡ãŒã¿ãŒã»ãããåãåãselectïŒïŒé¢æ°ããããŸããã
select(from_all().empty_timeout(150ms), case_(...), case_(...), ...); select(from_all().handle_n(2).no_wait_on_empty(), case_(...), case_(...), ...); select(from_all().empty_timeout(2s).extract_n(20).stop_on(...), case_(...), case_(...), ...); select(from_all().no_wait_on_empty().stop_on(...), case_(...), case_(...), ...);
ãããã£ãŠãselectïŒïŒãšreceiveïŒïŒã®äž¡æ¹ã«é©ãã1ã€ã®ãœãªã¥ãŒã·ã§ã³ãååŸãããã£ãã®ã§ãã ããã«ãã³ããŒã¢ã³ãããŒã¹ããåé¿ããããã«ãselectïŒïŒããã³receiveïŒïŒèªäœã®ãã©ã¡ãŒã¿ãŒã¯æ¢ã«ã³ãŒãã§è¡šãããŠããŸããã ãã ããããã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãã
å¯èœãªè§£æ±ºç
ãããã£ãŠãã¿ã¹ã¯ã¯ããŠãŒã¶ãŒãhandle_allïŒïŒãhandle_nïŒïŒãŸãã¯extract_nïŒïŒãå¿ ãåŒã³åºãããšã§ãã
ååãšããŠãããã¯è€éãªæ±ºå®ã«é Œãããšãªãéæã§ããŸãã ããšãã°ãselectïŒïŒããã³receiveïŒïŒã«è¿œå ã®åŒæ°ãå ¥åã§ããŸãã
receive(handle_all(), from(ch).empty_timeout(150ms), ...); select(handle_n(20), from_all().no_wait_on_empty(), ...);
ãŸãã¯ããŠãŒã¶ãŒã«åŒ·å¶çã«receiveïŒïŒ/ selectïŒïŒåŒã³åºããè¡ãããããšãã§ããŸãã
receive(handle_all(from(ch).empty_timeout(150ms)), ...); select(handle_n(20, from_all().no_wait_on_empty()), ...);
ãã ããããã§ã®åé¡ã¯ãSObjectizerã®æ°ããããŒãžã§ã³ã«åãæ¿ãããšããŠãŒã¶ãŒãã³ãŒããããçŽãå¿ èŠãããããšã§ãã ååãšããŠãã³ãŒãã¯æçŽããå¿ èŠãšããŸããã§ããã ãã®ç¶æ³ã§ã¯æ¬¡ã®ããã«èšããŸãïŒ
receive(from(ch).handle_n(2).no_wait_on_empty(), ...); select(from_all().empty_timeout(2s).extract_n(20).stop_on(...), case_(...), case_(...), ...);
ç§ã®æèŠã§ã¯ãããã¯éåžžã«æ·±å»ãªåé¡ã§ãã å¥ã®æ¹æ³ãæ¢ããŸãã ãããŠããã®æ¹æ³ã以äžã«èª¬æããŸãã
ããã§ã¯ãCRTPã¯ã©ãããæ¥ãã®ã§ããããïŒ
èšäºã®ã¿ã€ãã«ã¯CRTPã«èšåããŠããŸãã 圌ã¯ãŸããäžæè°ãªç¹°ãè¿ãã®ãã³ãã¬ãŒããã¿ãŒã³ã§ãïŒãã®èå³æ·±ãããå°ãè³ã«å¯å®¹ãªãã¯ããã¯ã«ç²Ÿéããã人ã¯ãFluent C ++ããã°ã®ãã®äžé£ã®æçš¿ããå§ããããšãã§ããŸãïŒã
CRTPã«èšåããã®ã¯ãCRTPãä»ããŠreceiveïŒïŒããã³selectïŒïŒé¢æ°ã®ãã©ã¡ãŒã¿ãŒã䜿çšããäœæ¥ãå®è£ ããããã§ãã receiveïŒïŒããã³selectïŒïŒã®ãã©ã¡ãŒã¿ãŒã®å€§éšåã¯åãã§ãã£ããããã³ãŒãã¯æ¬¡ã®ãããªãã®ã䜿çšããŸããã
template<typename Derived> class bulk_processing_params_t { ...; // . Derived & self_reference() { return static_cast<Derived &>(*this); } ... public: auto & handle_n(int v) { to_handle_ = v; return self_reference(); } ... auto & extract_n(int v) { to_extract_ = v; return self_reference(); } ... }; class receive_processing_params_t final : public bulk_processing_params_t<receive_processing_params_t> { ...; // receive . }; class select_processing_params_t final : public bulk_processing_params_t<select_processing_params_t> { ...; };
ããã§CRTPãå¿ èŠãªã®ã¯ãªãã§ããïŒ
ããã§CRTPã䜿çšããŠãåºæ¬ã¯ã©ã¹ã§å®çŸ©ãããã»ãã¿ãŒã¡ãœããããåºæ¬åã§ã¯ãªã掟çåãžã®åç §ãè¿ãããã«ããå¿ èŠããããŸããã
ã€ãŸããCRTPã䜿çšãããéåžžã®ç¶æ¿ã䜿çšããå Žåã次ã®ããã«ããæžãããšãã§ããŸããã
class bulk_processing_params_t { public: // bulk_processing_params_t, // . bulk_processing_params_t & handle_n(int v) {...} bulk_processing_params_t & extract_n(int v) {...} ... }; class receive_processing_params_t final : public bulk_processing_params_t { public: // // bulk_processing_params_t, // receive_processing_params_t. ... // // receive_processing_params_t. receive_processing_params_t & receive_payload(int v) {...} }; class select_processing_params_t final : public bulk_processing_params_t { public: // // bulk_processing_params_t, // select_processing_params_t. ... };
ãããããã®ãããªåå§çãªã¡ã«ããºã ã§ã¯ãåããã«ããŒãã¿ãŒã³ã䜿çšã§ããŸããã
receive_processing_params_t{}.handle_n(20).receive_payload(0)
ã³ã³ãã€ã«ãããŠããŸããã handle_nïŒïŒã¡ãœããã¯bulk_processing_params_tãžã®åç §ãè¿ããŸãããããã§receive_payloadïŒïŒã¡ãœããã¯ãŸã å®çŸ©ãããŠããŸããã
ãã ããCRTPã§ã¯ããã«ããŒãã¿ãŒã³ã«åé¡ã¯ãããŸããã
æçµæ±ºå®
æçµçãªè§£æ±ºçã¯ãreceive_processing_params_tãselect_processing_params_tãªã©ã®æçµåããã³ãã¬ãŒãåã«ãªãããšã§ãã ãã®ããã次ã®åœ¢åŒã®ã¹ã«ã©ãŒã§ãã©ã¡ãŒã¿ãŒåãããŸãã
enum class msg_count_status_t { undefined, defined };
ãããŠãæçµåãT <msg_count_status_t :: undefined>ããT <msg_count_status_t :: defined>ã«å€æã§ããããã«ããŸãã
ããã«ãããããšãã°receiveïŒïŒé¢æ°ã§receive_processing_params_tãåä¿¡ããcomp-timeã§Statuså€ã確èªã§ããŸãã 次ã®ãããªãã®ïŒ
template< msg_count_status_t Msg_Count_Status, typename... Handlers > inline mchain_receive_result_t receive( const mchain_receive_params_t<Msg_Count_Status> & params, Handlers &&... handlers ) { static_assert( Msg_Count_Status == msg_count_status_t::defined, "message count to be processed/extracted should be defined " "by using handle_all()/handle_n()/extract_n() methods" );
äžè¬çã«ããã¹ãŠããã€ãã®ããã«åçŽã§ãïŒå®è¡ããŠãã ãã;ïŒ
è¡ããã決å®ã®èª¬æ
SObjectizerã®è©³çŽ°ããåãé¢ãããæå°éã®äŸãèŠãŠã¿ãŸãããã
ãã®ãããã¡ãã»ãŒãžæ°ã®å¶éãèšå®ãããã©ããã決å®ããã¿ã€ããæ¢ã«ãããŸãã
enum class msg_count_status_t { undefined, defined };
次ã«ããã¹ãŠã®å ±éãã©ã¡ãŒã¿ãŒãæ ŒçŽãããæ§é ãå¿ èŠã§ãã
struct basic_data_t { int to_extract_{}; int to_handle_{}; int common_payload_{}; };
basic_data_tã®å 容ã¯ãŸã£ããç°ãªããŸãã ããšãã°ãäžèšã®æå°éã®ãã£ãŒã«ãã»ãããé©ããŠããŸãã
basic_data_tã«é¢é£ããŠãç¹å®ã®æäœïŒreceiveïŒïŒãselectïŒïŒããŸãã¯ãã®ä»ïŒã«å¯ŸããŠãbasic_data_tãç¶æ¿ããç¬èªã®å ·è±¡åãäœæãããããšãéèŠã§ãã ããšãã°ãæœè±¡åãããäŸã®receiveïŒïŒã®å Žåãããã¯æ¬¡ã®æ§é ã«ãªããŸãã
struct receive_specific_data_t final : public basic_data_t { int receive_payload_{}; receive_specific_data_t() = default; receive_specific_data_t(int v) : receive_payload_{v} {} };
basic_data_tæ§é ãšãã®åå«ãåé¡ãåŒãèµ·ãããªããšä»®å®ããŸãã ãããã£ãŠããœãªã¥ãŒã·ã§ã³ã®ããè€éãªéšåã«é²ã¿ãŸãã
ããã§ãgetterã¡ãœãããæäŸããbasic_data_tã®ã©ãããŒãå¿ èŠã§ãã ããã¯ã次ã®åœ¢åŒã®ãã³ãã¬ãŒãã¯ã©ã¹ã«ãªããŸãã
template<typename Basic_Data> class basic_data_holder_t { private : Basic_Data data_; protected : void set_to_extract(int v) { data_.to_extract_ = v; } void set_to_handle(int v) { data_.to_handle_ = v; } void set_common_payload(int v) { data_.common_payload_ = v; } const auto & data() const { return data_; } public : basic_data_holder_t() = default; basic_data_holder_t(Basic_Data data) : data_{std::move(data)} {} int to_extract() const { return data_.to_extract_; } int to_handle() const { return data_.to_handle_; } int common_payload() const { return data_.common_payload_; } };
ãã®ã¯ã©ã¹ã¯å®åã§ãããããbasic_data_tã®ç¶æ¿è ãå«ããããšãã§ããŸãããbasic_data_tã«ãããã£ãŒã«ãã«å¯ŸããŠã®ã¿getterã¡ãœãããå®è£ ããŸãã
ãœãªã¥ãŒã·ã§ã³ã®ããã«è€éãªéšåã«é²ãåã«ãbasic_data_holder_tã®dataïŒïŒã¡ãœããã«æ³šæããå¿ èŠããããŸãã ããã¯éèŠãªæ¹æ³ã§ãããåŸã§èª¬æããŸãã
ããã§ãããŒãã³ãã¬ãŒãã¯ã©ã¹ã«ç§»ããŸããããã¯ãçŸä»£ã®C ++ã«ããŸãç±å¿ã§ã¯ãªã人ã«ãšã£ãŠã¯ããªãæããããã®ã§ãã
template<typename Data, typename Derived> class basic_params_t : public basic_data_holder_t<Data> { using base_type = basic_data_holder_t<Data>; public : using actual_type = Derived; using data_type = Data; protected : actual_type & self_reference() { return static_cast<actual_type &>(*this); } decltype(auto) clone_as_defined() { return self_reference().template clone_if_necessary< msg_count_status_t::defined >(); } public : basic_params_t() = default; basic_params_t(data_type data) : base_type{std::move(data)} {} decltype(auto) handle_all() { this->set_to_handle(0); return clone_as_defined(); } decltype(auto) handle_n(int v) { this->set_to_handle(v); return clone_as_defined(); } decltype(auto) extract_n(int v) { this->set_to_extract(v); return clone_as_defined(); } actual_type & common_payload(int v) { this->set_common_payload(v); return self_reference(); } using base_type::common_payload; };
ãã®basic_params_tã¯ã¡ã€ã³ã®CRTPãã³ãã¬ãŒãã§ãã çŸåšã®ã¿ã2ã€ã®ãã©ã¡ãŒã¿ãŒã«ãã£ãŠãã©ã¡ãŒã¿ãŒåãããŠããŸãã
æåã®ãã©ã¡ãŒã¿ãŒã¯ãå éšã«å«ããå¿ èŠãããããŒã¿åã§ãã ããšãã°ãreceive_specific_data_tãŸãã¯select_specific_data_tã
2çªç®ã®ãã©ã¡ãŒã¿ãŒã¯ãCRTPã§ããç¥ãããŠããåŸç¶ã®ã¿ã€ãã§ãã self_referenceïŒïŒã¡ãœããã§äœ¿çšããŠã掟çåãžã®åç §ãååŸããŸãã
basic_params_tãã³ãã¬ãŒãã®å®è£ ã®éèŠãªãã€ã³ãã¯ããã®clone_as_definedïŒïŒã¡ãœããã§ãã ãã®ã¡ãœããã¯ãçžç¶äººãclone_if_necessaryïŒïŒã¡ãœãããå®è£ ããããšãæ³å®ããŠããŸãã ãããŠããã®clone_if_necessaryïŒïŒã¯ããªããžã§ã¯ãT <msg_count_status_t :: undefined>ããªããžã§ã¯ãT <msg_count_status_t :: defined>ã«å€æããããã«èšèšãããŠããŸãã ãããŠããã®ãããªå€æã¯ãã»ãã¿ãŒã¡ãœããhandle_allïŒïŒãhandle_nïŒïŒãextract_nïŒïŒã§éå§ãããŸãã
ããã«ãclone_as_definedïŒïŒãhandle_allïŒïŒãhandle_nïŒïŒããã³extract_nïŒïŒãæ»ãå€ã®ã¿ã€ããdecltypeïŒautoïŒãšããŠæ±ºå®ãããšããäºå®ã«æ³šæãæãããšãã§ããŸãã ããã¯å¥ã®ããªãã¯ã§ããããã«ã€ããŠã¯ããã«èª¬æããŸãã
ããã§ãããããã¹ãŠãèãåºãããæçµåã®1ã€ããã§ã«èŠãããšãã§ããŸãã
template< msg_count_status_t Msg_Count_Status > class receive_specific_params_t final : public basic_params_t< receive_specific_data_t, receive_specific_params_t<Msg_Count_Status> > { using base_type = basic_params_t< receive_specific_data_t, receive_specific_params_t<Msg_Count_Status> >; public : template<msg_count_status_t New_Msg_Count_Status> std::enable_if_t< New_Msg_Count_Status != Msg_Count_Status, receive_specific_params_t<New_Msg_Count_Status> > clone_if_necessary() const { return { this->data() }; } template<msg_count_status_t New_Msg_Count_Status> std::enable_if_t< New_Msg_Count_Status == Msg_Count_Status, receive_specific_params_t& > clone_if_necessary() { return *this; } receive_specific_params_t(int receive_payload) : base_type{ typename base_type::data_type{receive_payload} } {} receive_specific_params_t(typename base_type::data_type data) : base_type{ std::move(data) } {} int receive_payload() const { return this->data().receive_payload_; } };
æåã«æ³šæããå¿ èŠãããã®ã¯ãbase_type :: data_typeãåãã³ã³ã¹ãã©ã¯ã¿ãŒã§ãã ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšãããšãçŸåšã®ãã©ã¡ãŒã¿ãŒå€ã¯T <msg_count_status_t :: undefined>ããT <msg_count_status_t :: defined>ãžã®å€æäžã«è»¢éãããŸãã
æŠããŠããã®receive_specific_params_tã¯æ¬¡ã®ãããªãã®ã§ãã
template<typename V, int K> class holder_t { V v_; public: holder_t() = default; holder_t(V v) : v_{std::move(v)} {} const V & value() const { return v_; } }; holder_t<std::string, 0> v1{"Hello!"}; holder_t<std::string, 1> v2; v2 = v1; // , v1 v2 . v2 = holder_t<std::string, 1>{v1.value()}; // .
ãŸããåè¿°ã®ã³ã³ã¹ãã©ã¯ã¿receive_specific_params_tã§ã¯ãreceive_specific_params_t <msg_count_status_t :: defined>ãreceive_specific_params_t <msg_count_status_t :: undefined>ã®å€ã§åæåã§ããŸãã
receive_specific_params_tã§2çªç®ã«éèŠãªããšã¯ã2ã€ã®clone_if_necessaryïŒïŒã¡ãœããã§ãã
ãªã2ã€ããã®ã§ããïŒ SFINAE-vskayaã®ãã¹ãŠã®éæ³ã¯ããã®å®çŸ©ã§äœãæå³ããŸããïŒ
äžèŠãªå€æãé¿ããããã«ã2ã€ã®clone_if_necessaryïŒïŒã¡ãœãããäœæãããŸããã ããã°ã©ããŒãhandle_nïŒïŒã¡ãœãããåŒã³åºãããã§ã«receive_specific_params_t <msg_count_status_t :: defined>ãåãåã£ããšããŸãã ãããŠãextract_nïŒïŒãåŒã³åºããŸããã ããã¯èš±å¯ãããŠãããhandle_nïŒïŒãšextract_nïŒïŒã¯ãããã«ç°ãªãå¶éãèšå®ããŸãã extract_nïŒïŒã®åŒã³åºãã¯ãreceive_specific_params_t <msg_count_status_t :: defined>ãæäŸããå¿ èŠããããŸãã ãããããã§ã«ãããŸãã ã§ã¯ãæ¢åã®ãã®ãåå©çšããªãã®ã¯ãªãã§ããïŒ
ãã®ããã2ã€ã®clone_if_necessaryïŒïŒã¡ãœãããããã«ãããŸãã æåã®æ¹æ³ã¯ãå€æãæ¬åœã«å¿ èŠãªãšãã«æ©èœããŸãã
template<msg_count_status_t New_Msg_Count_Status> std::enable_if_t< New_Msg_Count_Status != Msg_Count_Status, receive_specific_params_t<New_Msg_Count_Status> > clone_if_necessary() const { return { this->data() }; }
ã³ã³ãã€ã©ãŒã¯ãäŸãã°ãç¶æ³ãæªå®çŸ©ããå®çŸ©æžã¿ã«å€ãããšãã«ããããéžæããŸãã ãããŠããã®ã¡ãœããã¯æ°ãããªããžã§ã¯ããè¿ããŸãã ãããŠãã¯ãããã®ã¡ãœããã®å®è£ ã§ã¯ãbasic_data_holder_tãšæ©ãå®çŸ©ãããdataïŒïŒåŒã³åºãã«æ³šæãæããŸãã
2çªç®ã®æ¹æ³ïŒ
template<msg_count_status_t New_Msg_Count_Status> std::enable_if_t< New_Msg_Count_Status == Msg_Count_Status, receive_specific_params_t& > clone_if_necessary() { return *this; }
ã¹ããŒã¿ã¹ãå€æŽããå¿ èŠããªãå Žåã«åŒã³åºãããŸãã ãããŠããã®ã¡ãœããã¯æ¢åã®ãªããžã§ã¯ããžã®åç §ãè¿ããŸãã
ããã§ãå€ãã®ã¡ãœããã®basic_params_tã§æ»ãåãdecltypeïŒautoïŒãšããŠå®çŸ©ãããçç±ãæããã«ãªãã¯ãã§ãã çµå±ããããã®ã¡ãœããã¯clone_if_necessaryïŒïŒã®ç¹å®ã®ããŒãžã§ã³ã掟çåã§åŒã³åºãããããšã«äŸåããŠããããªããžã§ã¯ããŸãã¯ãªã³ã¯ã®ãããããè¿ãããå¯èœæ§ããããŸã...äºåã«äºæž¬ããããšã¯ã§ããŸããã ãããŠãããã§decltypeïŒautoïŒãå©ãã«ãªããŸãã
å°ããå 責äºé
説æããæå°éã®äŸã¯ãéžæãããœãªã¥ãŒã·ã§ã³ã®æãåçŽã§æãç解ãããããã¢ãç®çãšããŠããŸãã ãããã£ãŠãã³ãŒãã«çµã¿èŸŒãŸããããšãè«ãéåžžã«æçœãªãã®ã¯ãããŸããã
ããšãã°ãbasic_data_holder_t :: dataïŒïŒã¡ãœããã¯ãããŒã¿ãžã®å®æ°åç §ãè¿ããŸãã ããã«ãããT <msg_count_status_t :: undefined>ããT <msg_count_status_t :: defined>ãžã®å€æäžã«ãã©ã¡ãŒã¿ãŒå€ãã³ããŒãããŸãã ãã©ã¡ãŒã¿ã®ã³ããŒãé«äŸ¡ãªæäœã§ããå Žåã移åã»ãã³ãã£ã¯ã¹ã«æžæãå¿ èŠããããdataïŒïŒã¡ãœããã¯æ¬¡ã®åœ¢åŒã«ãªããŸãã
auto data() { return std::move(data_); }
ãŸãããã¹ãŠã®æçµåïŒreceive_specific_params_tãselect_specific_params_tãªã©ïŒã«ãclone_if_necessaryã¡ãœããã®å®è£ ãå«ããå¿ èŠããããŸãã ã€ãŸã ãã®å Žæã§ã¯ããŸã ã³ããŒããŒã¹ãã䜿çšããŠããŸãã ãããããåãã¿ã€ãã®ã³ãŒãã®éè€ãé¿ããããã«ãäœãèããã¹ãããšããããŸãã
確ãã«ããæ§æã®ãªãŒããŒãããããæžããããã«noexceptã¯ã³ãŒãã«èšè¿°ãããŠããŸããã
ããã ãã§ã
ããã§èª¬æããæå°éã®äŸã®ãœãŒã¹ã³ãŒãã¯ãããã«ãããŸã ã ãããŠãäŸãã°ã ããã§ãªã³ã©ã€ã³ã³ã³ãã€ã©ã§éã¶ããšãã§ããŸã ïŒ163è¡ç®ã§handle_allïŒïŒã®åŒã³åºããã³ã¡ã³ãã¢ãŠãããŠãäœãèµ·ããããèŠãããšãã§ããŸãïŒã
ç§ãå®è£ ããã¢ãããŒããå¯äžã®æ£ããã¢ãããŒãã§ãããšã¯èšããããããŸããã ãããããŸããã³ããŒã¢ã³ãããŒã¹ãã§ãªãéããç§ã¯ä»£æ¿æ¡ãèŠãŸããã ãããŠã第äºã«ããããè¡ãããšã¯ãŸã£ããé£ãããããŸããã§ããã幞ããªããšã«ãå€ãã®æéã¯ããããŸããã§ããã ããããå€ããã¹ããšäŸãSObjectizerã®ææ°ããŒãžã§ã³ã®æ°ããæ©èœã«é©å¿ãããããã³ã³ãã€ã©ã®ãã³ãã¯ããã«éåžžã«åœ¹ç«ã¡ãŸããã
ããã§ãç§ã«é¢ããŠã¯ãC ++ã¯ãããè€éã§ããããšãããäžåºŠç¢ºèªããŸããã ããããããã ãã§ã¯ãªããéçºè ã«ããå€ãã®æ©äŒãäžããããã§ãã ãŸããããããã¹ãŠç§ãããç°¡åãªæ¹æ³ã§ææ°ã®C ++ã§ååŸã§ãããšããŠãé©ããªãã§ãããã
PSã èªè ã®1人ãSObjectizerããã©ããŒããŠããå Žåã5.5ãã©ã³ããšã®äºææ§ãå€§å¹ ã«äŸµå®³ãããæ°ããããŒãžã§ã³5.6ã¯ããã§ã«ããªãæ¯ã¥ããŠãããšèšããŸãã BitBucketã§èŠã€ããããšãã§ããŸãã ãã®ãªãªãŒã¹ã¯ãŸã é·ãéã®ãã§ãããSObjectizer-5.6ã¯ãã§ã«æå³ãããŠãããã®ã§ãã ããªãã®å°è±¡ãåããè©ŠããŠãå ±æããããšãã§ããŸãã