@@ -389,30 +389,17 @@ struct ClientParam
389
389
390
390
struct BuildParams : IterateFieldsHelper<BuildParams, sizeof ...(Types)>
391
391
{
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)
411
394
{
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 );
416
403
}
417
404
418
405
BuildParams (ClientParam* client_param) : m_client_param(client_param) {}
@@ -421,24 +408,15 @@ struct ClientParam
421
408
422
409
struct ReadResults : IterateFieldsHelper<ReadResults, sizeof ...(Types)>
423
410
{
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...>)
432
413
{
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
+ };
435
418
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 );
442
420
}
443
421
444
422
ReadResults (ClientParam* client_param) : m_client_param(client_param) {}
0 commit comments