@@ -111,14 +111,11 @@ namespace rtl
111111 template <class ...args_t >
112112 inline constructor<args_t ...> Record::ctor () const
113113 {
114- constructor<args_t ...> fnCtor;
115- const auto & method = m_methods.at (detail::ctor_name (m_recordName));
116- const auto & functorsMeta = method.getFunctorsMeta ();
117-
118114 std::vector<rtl::type_meta> fnTyMetas (detail::call_by::ncref);
119-
120115 auto normalId = traits::uid<traits::normal_sign_id_t <args_t ...>>::value;
121- for (auto & ty_meta : functorsMeta)
116+ const auto & method = m_methods.at (detail::ctor_name (m_recordName));
117+
118+ for (auto & ty_meta : method.getFunctorsMeta ())
122119 {
123120 if (normalId == ty_meta.get_normal_args_id ())
124121 {
@@ -132,17 +129,26 @@ namespace rtl
132129 }
133130 }
134131
135- std::size_t index = rtl::index_none;
136- auto strictId = traits::uid<traits::strict_sign_id_t <args_t ...>>::value;
137- for (int i = 0 ; i < fnTyMetas.size (); i++)
132+ constructor<args_t ...> fnCtor;
133+ for (auto & ty_meta : fnTyMetas)
138134 {
139- auto & ty_meta = fnTyMetas[i];
140- if (!ty_meta. is_empty () && ty_meta. get_strict_args_id () == strictId) {
141- index = i ;
142- break ;
135+ if ( ty_meta. is_empty ()) {
136+ fnCtor. get_hop (). push_back ( nullptr );
137+ fnCtor. get_overloads (). push_back ( nullptr ) ;
138+ continue ;
143139 }
140+
141+ using fn_cast = dispatch::functor_cast<dispatch::fn_void::no, traits::normal_sign_t <args_t >...>;
142+ auto fn = fn_cast (ty_meta.get_functor ()).template to_function <dispatch::erase::t_ctor>();
143+
144+ fnCtor.get_hop ().push_back (fn.f_ptr ());
145+ fnCtor.get_overloads ().push_back (&ty_meta.get_functor ());
146+ fnCtor.set_init_error (error::None);
144147 }
145148
149+ if (fnCtor.get_init_error () != error::None) {
150+ fnCtor.set_init_error (error::SignatureMismatch);
151+ }
146152 return fnCtor;
147153 }
148154}
0 commit comments