Захватить лямбдой аргументы вариативного шаблона
Нужно сделать враппер внутри шаблонного метода.
Подскажите, как правильно передать в лямбду список аргументов:
template <typename Func, typename... Args>
void exec(Func&& func, Args&&... args)
{
auto worker = [this, f = std::forward<Func>(func), a = std::forward<Args>(args)...]()
{
try
{
f(a);
}
catch (const std::exception& e)
{
std::cerr << e.what();
}
};
std::async(worker);
}
как синтаксически правильно сделать передачу в этой строке:
a = std::forward<Args>(args)...
не понимает компилятор. хотя вызов (без враппера) метода exec вот таким образом работает:
someInstance.exec(std::forward<Func>(func), std::forward<Args>(args)...);
Ответы (1 шт):
Автор решения: αλεχολυτ
→ Ссылка
Вот так работает:
#include <iostream>
template <typename Func, typename... Args>
void exec(Func&& func, Args&&... args)
{
auto worker = [f = std::forward<Func>(func), ...a = std::forward<Args>(args)]()
{
f(a...);
};
worker();
}
void f(int a, double b) {
std::cout << a << " " << b << "\n";
}
int main() {
exec(f, 42, 1.234);
}
Но нужно C++20.
Для C++17 можно обернуть в std::tuple:
template <typename Func, typename... Args>
void exec(Func&& func, Args&&... args)
{
auto worker = [f = std::forward<Func>(func), a = std::make_tuple(std::forward<Args>(args)...)]()
{
std::apply(f, a);
};
worker();
}