@@ -389,30 +389,17 @@ struct ClientParam
389389
390390 struct BuildParams : IterateFieldsHelper<BuildParams, sizeof ...(Types)>
391391 {
392- template <typename ... Args>
393- void handleField (Args&&... args)
394- {
395- callBuild<0 >(std::forward<Args>(args)...);
396- }
397-
398- // TODO Possible optimization to speed up compile time:
399- // https://stackoverflow.com/a/7858971 Using enable_if below to check
400- // position when unpacking tuple might be slower than pattern matching
401- // approach in the stack overflow solution
402- template <size_t I, typename ... Args>
403- auto callBuild (Args&&... args) -> std::enable_if_t<(I < sizeof ...(Types))>
404- {
405- callBuild<I + 1 >(std::forward<Args>(args)..., std::get<I>(m_client_param->m_values ));
406- }
407-
408- template <size_t I, typename Params, typename ParamList, typename ... Values>
409- auto callBuild (ClientInvokeContext& invoke_context, Params& params, ParamList, Values&&... values) ->
410- std::enable_if_t<(I == sizeof ...(Types))>
392+ template <typename Params, typename ParamList>
393+ void handleField (ClientInvokeContext& invoke_context, Params& params, ParamList)
411394 {
412- MaybeBuildField (std::integral_constant<bool , Accessor::in>(), ParamList (), invoke_context,
413- Make<StructField, Accessor>(params), std::forward<Values>(values)...);
414- MaybeSetWant (
415- ParamList (), Priority<1 >(), std::forward<Values>(values)..., Make<StructField, Accessor>(params));
395+ auto const fun = [&]<typename ... Values>(Values&&... values) {
396+ MaybeBuildField (std::integral_constant<bool , Accessor::in>(), ParamList (), invoke_context,
397+ Make<StructField, Accessor>(params), std::forward<Values>(values)...);
398+ MaybeSetWant (
399+ ParamList (), Priority<1 >(), std::forward<Values>(values)..., Make<StructField, Accessor>(params));
400+ };
401+
402+ std::apply (fun, m_client_param->m_values );
416403 }
417404
418405 BuildParams (ClientParam* client_param) : m_client_param(client_param) {}
@@ -421,24 +408,15 @@ struct ClientParam
421408
422409 struct ReadResults : IterateFieldsHelper<ReadResults, sizeof ...(Types)>
423410 {
424- template <typename ... Args>
425- void handleField (Args&&... args)
426- {
427- callRead<0 >(std::forward<Args>(args)...);
428- }
429-
430- template <int I, typename ... Args>
431- auto callRead (Args&&... args) -> std::enable_if_t<(I < sizeof ...(Types))>
411+ template <typename Results, typename ... Params>
412+ void handleField (ClientInvokeContext& invoke_context, Results& results, TypeList<Params...>)
432413 {
433- callRead<I + 1 >(std::forward<Args>(args)..., std::get<I>(m_client_param->m_values ));
434- }
414+ auto const fun = [&]<typename ... Values>(Values&&... values) {
415+ MaybeReadField (std::integral_constant<bool , Accessor::out>(), TypeList<Decay<Params>...>(), invoke_context,
416+ Make<StructField, Accessor>(results), ReadDestUpdate (values)...);
417+ };
435418
436- template <int I, typename Results, typename ... Params, typename ... Values>
437- auto callRead (ClientInvokeContext& invoke_context, Results& results, TypeList<Params...>, Values&&... values)
438- -> std::enable_if_t<I == sizeof...(Types)>
439- {
440- MaybeReadField (std::integral_constant<bool , Accessor::out>(), TypeList<Decay<Params>...>(), invoke_context,
441- Make<StructField, Accessor>(results), ReadDestUpdate (values)...);
419+ std::apply (fun, m_client_param->m_values );
442420 }
443421
444422 ReadResults (ClientParam* client_param) : m_client_param(client_param) {}
0 commit comments