@@ -20,47 +20,41 @@ namespace rtl::dispatch
2020 template <class return_t , class ...signature_t >
2121 struct aware_return
2222 {
23- constexpr static auto get_lambda_void () noexcept
23+ constexpr static void get_lambda_void (const functor& fn, traits:: normal_sign_t < signature_t >&&... params ) noexcept
2424 {
25- return []( const functor& fn, traits:: normal_sign_t < signature_t >&&... params)-> auto
25+ if constexpr (std::is_void_v< return_t >)
2626 {
27- if constexpr (std::is_void_v<return_t >)
28- {
29- auto fptr = static_cast <const function_ptr<return_t , signature_t ...>&>(fn).f_ptr ();
30- (*fptr)(std::forward<signature_t >(params)...);
31- }
32- };
27+ auto fptr = static_cast <const function_ptr<return_t , signature_t ...>&>(fn).f_ptr ();
28+ (*fptr)(std::forward<signature_t >(params)...);
29+ }
3330 }
3431
35- constexpr static auto get_lambda_any_return () noexcept
32+ constexpr static std::any get_lambda_any_return (const functor& fn, traits:: normal_sign_t < signature_t >&&... params ) noexcept
3633 {
37- return []( const functor& fn, traits:: normal_sign_t < signature_t >&&... params)-> auto
34+ if constexpr (!std::is_void_v< return_t >)
3835 {
39- if constexpr (!std::is_void_v<return_t >)
40- {
41- auto fptr = static_cast <const function_ptr<return_t , signature_t ...>&>(fn).f_ptr ();
42- auto && ret_v = (*fptr)(std::forward<signature_t >(params)...);
36+ auto fptr = static_cast <const function_ptr<return_t , signature_t ...>&>(fn).f_ptr ();
37+ auto && ret_v = (*fptr)(std::forward<signature_t >(params)...);
4338
44- if constexpr (std::is_pointer_v<return_t >)
45- {
46- using raw_t = std::remove_pointer_t <return_t >;
47- return std::any (static_cast <const raw_t *>(ret_v));
48- }
49- else if constexpr (std::is_reference_v<return_t >)
50- {
51- using raw_t = std::remove_cv_t <std::remove_reference_t <return_t >>;
52- return std::any (static_cast <const raw_t *>(&ret_v));
53- }
54- else
55- {
56- using raw_ct = std::add_const_t <std::remove_reference_t <decltype (ret_v)>>;
57- // TODO: enable it for move-constructible objects.
58- static_assert (std::is_copy_constructible_v<return_t >, " return-type must be copy-constructible, required by std::any" );
59- return std::any (raw_ct (std::forward<decltype (ret_v)>(ret_v)));
60- }
39+ if constexpr (std::is_pointer_v<return_t >)
40+ {
41+ using raw_t = std::remove_pointer_t <return_t >;
42+ return std::any (static_cast <const raw_t *>(ret_v));
43+ }
44+ else if constexpr (std::is_reference_v<return_t >)
45+ {
46+ using raw_t = std::remove_cv_t <std::remove_reference_t <return_t >>;
47+ return std::any (static_cast <const raw_t *>(&ret_v));
48+ }
49+ else
50+ {
51+ using raw_ct = std::add_const_t <std::remove_reference_t <decltype (ret_v)>>;
52+ // TODO: enable it for move-constructible objects.
53+ static_assert (std::is_copy_constructible_v<return_t >, " return-type must be copy-constructible, required by std::any" );
54+ return std::any (raw_ct (std::forward<decltype (ret_v)>(ret_v)));
6155 }
62- else return std::any ();
63- } ;
56+ }
57+ else return std::any () ;
6458 }
6559 };
6660}
0 commit comments