Вы не можете многое сделать, чтобы избежать if
, если только вы абсолютно не знаете , что опциональное значение имеет значение (и если вы знаете, зачем использовать опциональное значение?)
Вы можете обернуть условную часть в лямбду / функцию:
#include <optional>
#include <boost/container/flat_set.hpp>
std::optional<boost::container::flat_set<int> > objects;
void f(int _v)
{
auto assure = [&]() -> decltype(auto)
{
if (objects.has_value())
return *objects;
else
return objects.emplace();
};
assure().insert(_v);
}
другим способом ...
#include <optional>
#include <boost/container/flat_set.hpp>
std::optional<boost::container::flat_set<int> > objects;
template<class T>
auto assure_contents(std::optional<T>& opt) -> T&
{
if (opt.has_value())
return *opt;
else
return opt.emplace();
}
void f(int _v)
{
assure_contents(objects).insert(_v);
}