C ++: Как инициализировать и вызвать метод на std :: необязательный? - PullRequest
0 голосов
/ 14 февраля 2019

Давайте рассмотрим этот код

std::optional<flat_set<int>> object;

void f(int v) {
    if (!object.has_value()) {
        object = flat_set<int>{};
    }
    object->insert(v);
}

Как можно избежать, если часть?Есть ли способ записать тело функции в одну строку, вызвав один метод?

1 Ответ

0 голосов
/ 14 февраля 2019

Вы не можете многое сделать, чтобы избежать 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);
}
...