без доп оверхеда (подчеркнуто)?
optional<int> opt;
...
if (opt && *opt == 0)
...
?
if(!opt.value_or(1))
потенциально обращаешься по пустому указатею?
где ты там указатель взял?
Ну это только в данном примере можно, а хотелось бы универсальное, для любого типа в optional.
для любого типа сделать нельзя, что для моего типа A должно значить условие == 0?
думаю, нужно opt && !*opt
Смысл глубже, нужно просто возвращать false, если нет значения и выполнять операцию если есть, там даже не обязательно '=='. Хочется что то типо: if (opt ""do something"") // false - если нет объекта // иначе ""do something""(*opt)
(Написал до этого сбщ)
Ради шутки предлагаю #define NON_TRIVIAL(X) X && *X == 0 if (NON_TRIVIAL (opt))
Конечно, макросами тут легко сделать, но это не спортивно))
напиши обёртку просто и всё
template<typename T, typename F> constexpr bool apply(const std::optional<T>& opt, F&& f) { return opt ? std::forward<F>(f)(opt.value()) : false; }
https://godbolt.org/z/v4fxTojMf )
И зачем это
не понятно где тут универсальность )
Тип то любой)
Обсуждают сегодня