1212#pragma once
1313
1414#include < any>
15- #include " erase_return .h"
15+ #include " rtl_forward_decls .h"
1616
1717namespace rtl ::dispatch
1818{
1919 template <class return_t , class ...signature_t >
20- struct aware_return : public erase_return <traits:: normal_sign_t < signature_t >...>
20+ struct aware_return
2121 {
22- using this_t = aware_return;
23- using base_t = erase_return<traits::normal_sign_t <signature_t >...>;
24-
25- constexpr static bool is_void = (std::is_void_v<return_t >);
26-
27- aware_return ()
28- : base_t ( is_void ? this_t ::get_lambda_void() : decltype (this_t ::get_lambda_void()) {},
29- !is_void ? this_t ::get_lambda_any_return() : decltype (this_t ::get_lambda_any_return()) {})
30- {
31- constexpr static bool is_const_cast_safe = (!traits::is_const_v<return_t >);
32- base_t ::m_return_id = detail::RObjectId::create<return_t , alloc::Stack>(is_const_cast_safe);
33- }
34-
3522 constexpr static auto get_lambda_void () noexcept
3623 {
3724 return [](const lambda_base& lambda, traits::normal_sign_t <signature_t >&&... params)-> auto
3825 {
39- if constexpr (is_void )
26+ if constexpr (std::is_void_v< return_t > )
4027 {
4128 auto fptr = lambda.template to_function <signature_t ...>()
4229 .template get_functor <void >();
@@ -50,7 +37,7 @@ namespace rtl::dispatch
5037 {
5138 return [](const lambda_base& lambda, traits::normal_sign_t <signature_t >&&... params)-> auto
5239 {
53- if constexpr (!is_void )
40+ if constexpr (!std::is_void_v< return_t > )
5441 {
5542 auto fptr = lambda.template to_function <signature_t ...>()
5643 .template get_functor <return_t >();
@@ -70,6 +57,8 @@ namespace rtl::dispatch
7057 else
7158 {
7259 using raw_ct = std::add_const_t <std::remove_reference_t <decltype (ret_v)>>;
60+ // TODO: enable it for move-constructible objects, NRVO.
61+ static_assert (std::is_copy_constructible_v<return_t >, " return-type must be copy-constructible, required by std::any" );
7362 return std::any (raw_ct (std::forward<decltype (ret_v)>(ret_v)));
7463 }
7564 }
0 commit comments