Информация об изменениях

Сообщение Re: Вызов функтора для элементов переменного списка параметр от 30.03.2017 21:50

Изменено 30.03.2017 21:52 andyp

Re: Вызов функтора для элементов переменного списка параметров
Здравствуйте, rg45, Вы писали:



R>При этом важно сохранить порядок следования элементов. До сих пор не знаю, как лучше это реализовать, каждый раз приходится прибегать к какому-нибудь извращению типа такого:


  было
R>http://ideone.com/lVDSHX
R>
R>template <typename F, typename...Args>
R>void ForEach(F&& f, Args&&...args)
R>{
R>   auto wrapper = [&](auto&& t){ f(std::forward<decltype(t)>(t)); return 0; };
R>   std::initializer_list<int>{ wrapper(std::forward<Args>(args))... };
R>}
R>}
R>


R>Заранее благодарен тому, кто облегчит мои страдания.


если с++17 под рукой нет и враппера не хочется, то вот по С++14:

#include <iostream>
#include <utility>

template <typename F, typename...Args>
void ForEach(F&& f, Args&&...args)
{
   //auto wrapper = [&](auto&& t){ f(std::forward<decltype(t)>(t)); return 0; };
   auto v = {(f(args),0) ... };
   //тут написать что-то , чтобы компилятор не ругался на неиспользуемую переменную
   (void) v;
}

int main()
{
   ForEach([](auto&& t){ std::cout << t; }, "Pi = ", 3.14);
}


http://ideone.com/lVDSHX
Re: Вызов функтора для элементов переменного списка параметр
Здравствуйте, rg45, Вы писали:



R>При этом важно сохранить порядок следования элементов. До сих пор не знаю, как лучше это реализовать, каждый раз приходится прибегать к какому-нибудь извращению типа такого:


  было
R>http://ideone.com/lVDSHX
R>
R>template <typename F, typename...Args>
R>void ForEach(F&& f, Args&&...args)
R>{
R>   auto wrapper = [&](auto&& t){ f(std::forward<decltype(t)>(t)); return 0; };
R>   std::initializer_list<int>{ wrapper(std::forward<Args>(args))... };
R>}
R>}
R>


R>Заранее благодарен тому, кто облегчит мои страдания.


если с++17 под рукой нет и враппера не хочется, то вот по С++14:

#include <iostream>
#include <utility>

template <typename F, typename...Args>
void ForEach(F&& f, Args&&...args)
{
   //auto wrapper = [&](auto&& t){ f(std::forward<decltype(t)>(t)); return 0; };
   auto v = {(f(args),0) ... };
   //тут написать что-то , чтобы компилятор не ругался на неиспользуемую переменную
   (void) v;
}

int main()
{
   ForEach([](auto&& t){ std::cout << t; }, "Pi = ", 3.14);
}


http://ideone.com/jhekqM