Здравствуйте, 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