Мой класс имеет член типа optional<A>
.Я пытаюсь реализовать функцию emplaceWhenReady
, которая получает список параметров для конструктора А, но нетривиальная часть заключается в том, что A
может быть инициализирован только после определенного события.Когда emplaceWhenReady
вызывается перед событием, мне нужно каким-то образом захватить значения инициализации.
Для одного параметра конструктора код можно записать в виде:
struct B {
bool _ready;
std::optional<A> _a;
std::function<void()> _fInit;
template<typename ARG>
void emplaceWhenReady1(ARG&& arg) {
if (_ready) {
_a.emplace(std::forward<ARG>(arg));
} else {
_fInit = [this, argCopy = std::forward<ARG>(arg)]() {
_a.emplace(std::move(argCopy));
};
}
};
и _fInit()
canтеперь вызываться, когда класс становится _ready
.Но я не могу написать похожий код для нескольких параметров:
// Fails to compile
template<typename... ARGS>
void emplaceWhenReady(ARGS&&... args) {
if (_ready) {
_a.emplace(std::forward<ARGS>(args)...);
} else {
_fInit = [this, argsCopy = std::forward<ARGS>(args)...]() {
_a.emplace(std::move(argsCopy)...);
};
}
}
Godbolt: https://godbolt.org/z/Fi3o1S
error: expected ',' or ']' in lambda capture list
_fInit = [this, argsCopy = std::forward<ARGS>(args)...]() {
^
Любая помощь приветствуется!