Когда целесообразно использовать std :: необязательный - PullRequest
4 голосов
/ 29 апреля 2019

Мне было интересно, если это будет считаться допустимым использование std :: необязательно. У меня есть функция, которая возвращает process_id (std::uint32_t значение), было бы более эффективно иметь стандартную функцию "std::uint32_t", которая возвращает 0, если мы не найдем идентификатор целевого процесса или вернем std: : необязательно подойдет больше?

пример:

std::optional<std::uint32_t> FindProcessID(std::string_view process)
{
    bool find = false;

    if (!find)
        // we fail to find the process_id and return nothing.
        return std::nullopt;
    else if (find)
        return 100; // return the id
}

Я также делаю это при возврате unique_ptr, в отличие от простого возврата nullptr, но я не уверен, будет ли это рассматриваться как «злоупотребление» указанной функцией, и будет ли лучше просто вернуть 0 и проверить за это значение. Заранее спасибо.

1 Ответ

10 голосов
/ 29 апреля 2019

Мне было интересно, можно ли считать это допустимым использование std::optional

Да, да, да - это то, для чего std::optional!

было бы более эффективно возвращать 0, если мы потерпим неудачу

Технически да, std::optional - это обертка, поэтому она имеет небольшие накладные расходы.Однако вероятность того, что это является узким местом в производительности вашего кода, чрезвычайно мала.Если вы не уверены, создайте тест и сравните две версии вашей функции.

В настоящее время я делаю это при возврате unique_ptr, но я не уверен, будет ли это рассматриваться как "злоупотребление"упомянутая особенность

Это действительно не предполагаемый, идиоматический вариант использования для std::unique_ptr.Читатели вашего кода ожидают, что std::unique_ptr будет обрабатывать исключительное владение некоторым (возможно, полиморфным) объектом.Также не существует много допустимых сценариев для вставки примитивного целочисленного типа в интеллектуальный указатель, и не рекомендуется использовать std::unique_ptr для варианта использования, который идеально подходит для std::optional.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...