Как передать список параметров variadi c в функцию, которая принимает переменные параметры? - PullRequest
0 голосов
/ 27 марта 2020

У меня есть пакет параметров шаблона, который я хотел бы передать в функцию, которая принимает переменное число параметров. Поскольку я не знаю, сколько у меня фактически параметров, как я могу передать неизвестное количество элементов данных параметров в функцию?

template <typename BarType...>
Class Test
{
   explicit Test(BarType ...bars)
   {
   // Calling this function with parameter pack instead of this way 
   // (which won't even work with above parameter pack)
   FooFunction(
   [](BarType &bar1){ return bar1.bar_member; },
   [](BarType &bar2){ return bar2.bar_member; },
   [](BarType &bar3){ return bar3.bar_member; })
   }

}

Как я могу выполнить sh выше FooFunction без ручного перечисления всех трех параметров (что делает его более динамичным c)? Поскольку может быть больше параметров bar4, bar5 et c. Так что просто перечислить их вручную не получится.

1 Ответ

1 голос
/ 27 марта 2020

Похоже, что вам может понадобиться:

template <typename BarType...>
Class Test
{
   explicit Test(BarType ...bars)
   {
       FooFunction(bars.bar_member ...);
   }
};

Самый распространенный способ использования пакета параметров - это расширить его, поместив представление того, что должно быть в каждом элементе списка, после чего следует жетон эллипса ....

Итак, если мы возьмем специализацию Test<B1, B2, B3>, у него будет конструктор, подобный explicit Test(B1 b1, B2 b2, B3 b3);, за исключением того, что имена b1, b2 и b3 только что сделаны для объяснения. В этом теле функции возможны некоторые вещи, включающие в себя расширения пакета и то, что они будут создавать как:

std::make_tuple(bars...) -> std::make_tuple(b1, b2, b3)
std::tuple<BarType...>   -> std::tuple<B1, B2, B3>
f(g(bars) ...)           -> f(g(b1), g(b2), g(b3))
h<BarType>(bars)...      -> h<B1>(b1), h<B2>(b2), h<B3>(b3)

Последний расширяет как пакет параметров шаблона BarType, так и пакет параметров функции bars вместе, сопоставляя вверх соответствующие элементы пакета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...