@@ -74,71 +74,65 @@ namespace rtl::dispatch
7474 }
7575
7676 // erased-return-aware-target-function-returns(std::any)
77- constexpr static auto e_return_a_target_fnr () noexcept
77+ constexpr static auto e_return_a_target_fnr (const functor& fn, const record_t & p_target, traits:: normal_sign_t < signature_t >&&...params ) noexcept
7878 {
79- return []( const functor& fn, const record_t & p_target, traits:: normal_sign_t < signature_t >&&... params )-> auto
79+ if constexpr (!std::is_void_v< return_t >)
8080 {
81- if constexpr (!std::is_void_v<return_t >)
82- {
83- auto mptr = static_cast <const method_ptr<record_t , return_t , signature_t ...>&>(fn).f_ptr ();
81+ auto mptr = static_cast <const method_ptr<record_t , return_t , signature_t ...>&>(fn).f_ptr ();
8482
85- auto && ret_v = (const_cast <record_t &>(p_target).*mptr)(std::forward<signature_t >(params)...);
86-
87- if constexpr (std::is_pointer_v<return_t >)
88- {
89- using raw_t = std::remove_pointer_t <return_t >;
90- return std::any (static_cast <const raw_t *>(ret_v));
91- }
92- else if constexpr (std::is_reference_v<return_t >)
93- {
94- using raw_t = std::remove_cv_t <std::remove_reference_t <return_t >>;
95- return std::any (static_cast <const raw_t *>(&ret_v));
96- }
97- else
98- {
99- using raw_ct = std::add_const_t <std::remove_reference_t <decltype (ret_v)>>;
100- // TODO: enable it for move-constructible objects.
101- static_assert (std::is_copy_constructible_v<return_t >, " return-type must be copy-constructible, required by std::any" );
102- return std::any (raw_ct (std::forward<decltype (ret_v)>(ret_v)));
103- }
83+ auto && ret_v = (const_cast <record_t &>(p_target).*mptr)(std::forward<signature_t >(params)...);
84+
85+ if constexpr (std::is_pointer_v<return_t >)
86+ {
87+ using raw_t = std::remove_pointer_t <return_t >;
88+ return std::any (static_cast <const raw_t *>(ret_v));
10489 }
105- else return std::any ();
106- };
90+ else if constexpr (std::is_reference_v<return_t >)
91+ {
92+ using raw_t = std::remove_cv_t <std::remove_reference_t <return_t >>;
93+ return std::any (static_cast <const raw_t *>(&ret_v));
94+ }
95+ else
96+ {
97+ using raw_ct = std::add_const_t <std::remove_reference_t <decltype (ret_v)>>;
98+ // TODO: enable it for move-constructible objects.
99+ static_assert (std::is_copy_constructible_v<return_t >, " return-type must be copy-constructible, required by std::any" );
100+ return std::any (raw_ct (std::forward<decltype (ret_v)>(ret_v)));
101+ }
102+ }
103+ else return std::any ();
107104 }
108105
109106 // erased-return-erased-target-function-returns(std::any)
110- constexpr static auto e_return_e_target_fnr () noexcept
107+ constexpr static auto e_return_e_target_fnr (const functor& fn, const RObject& p_target, traits:: normal_sign_t < signature_t >&&... params ) noexcept
111108 {
112- return []( const functor& fn, const RObject& p_target, traits:: normal_sign_t < signature_t >&&... params)-> auto
109+ if constexpr (!std::is_void_v< return_t >)
113110 {
114- if constexpr (!std::is_void_v<return_t >)
115- {
116- const auto & target = p_target.view <record_t >()->get ();
111+ const auto & target = p_target.view <record_t >()->get ();
117112
118- auto mptr = static_cast <const method_ptr<record_t , return_t , signature_t ...>&>(fn).f_ptr ();
113+ auto mptr = static_cast <const method_ptr<record_t , return_t , signature_t ...>&>(fn).f_ptr ();
114+
115+ auto && ret_v = (const_cast <record_t &>(target).*mptr)(std::forward<signature_t >(params)...);
119116
120- auto && ret_v = (const_cast <record_t &>(target).*mptr)(std::forward<signature_t >(params)...);
121-
122- if constexpr (std::is_pointer_v<return_t >)
123- {
124- using raw_t = std::remove_pointer_t <return_t >;
125- return std::any (static_cast <const raw_t *>(ret_v));
126- }
127- else if constexpr (std::is_reference_v<return_t >)
128- {
129- using raw_t = std::remove_cv_t <std::remove_reference_t <return_t >>;
130- return std::any (static_cast <const raw_t *>(&ret_v));
131- }
132- else
133- {
134- using raw_ct = std::add_const_t <std::remove_reference_t <decltype (ret_v)>>;
135- // TODO: enable it for move-constructible objects.
136- static_assert (std::is_copy_constructible_v<return_t >, " return-type must be copy-constructible, required by std::any" );
137- return std::any (raw_ct (std::forward<decltype (ret_v)>(ret_v)));
138- }
117+ if constexpr (std::is_pointer_v<return_t >)
118+ {
119+ using raw_t = std::remove_pointer_t <return_t >;
120+ return std::any (static_cast <const raw_t *>(ret_v));
139121 }
140- else return std::any ();
141- };
122+ else if constexpr (std::is_reference_v<return_t >)
123+ {
124+ using raw_t = std::remove_cv_t <std::remove_reference_t <return_t >>;
125+ return std::any (static_cast <const raw_t *>(&ret_v));
126+ }
127+ else
128+ {
129+ using raw_ct = std::add_const_t <std::remove_reference_t <decltype (ret_v)>>;
130+ // TODO: enable it for move-constructible objects.
131+ static_assert (std::is_copy_constructible_v<return_t >, " return-type must be copy-constructible, required by std::any" );
132+ return std::any (raw_ct (std::forward<decltype (ret_v)>(ret_v)));
133+ }
134+ }
135+ else return std::any ();
142136 }
143137 };
144138}
0 commit comments