|
CookBook: вернуть из функции то, чего нет
|
|||
---|---|---|---|
#18+
Допустим, у нас в классе есть map<A, B> И нам надо сделать функцию поиска и возвращения значения из этой мапы: Код: plaintext 1. 2. 3. 4. 5. 6.
А как быть, если мы ничего не нашли? 1. Бросить исключение. Но тогда на каждый Get придётся в коде делать try-catch, и про это надо будет постоянно помнить. С другой стороны, нам всё равно возвращаемое значение надо как-то проверить, что оно "непустое", а exception нас от этого избавляет. 2. Завести внутри функции static B bEmpty = {0} и возвращать её. Но как-то не сильно красиво, да? Если будет у меня 5 функций в классе, которые что-то возвращают, то будет в памяти пять статических переменных. 2.1. Завести в классе B статическую "пустую" переменную. Но тогда map<int, string> печалится. 3. Возвращать значение вместо ссылки. Но тогда будет вызываться конструктор на каждый Get. 4. Передавать ссылку на B вторым параметром. Некрасиво и всё равно надо будет проверять на "пустоту". Получается, что все пункты, кроме первого, требуют проверку на "пустоту", но иногда "пустое" значение тоже валидно для кода. Например, вывод пустой строки в статусе. Кто как делает? Может есть какое-то истинно верное единственное решение? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 07:16 |
|
CookBook: вернуть из функции то, чего нет
|
|||
---|---|---|---|
#18+
"Под капотом" ссылка -- это указатель, почему его не возвращать, или nullptr. Если есть возможность, можешь возвращать std::optional<std::reference_wrapper<B>>{it->second} в случае успеха или std::nullopt. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 08:02 |
|
CookBook: вернуть из функции то, чего нет
|
|||
---|---|---|---|
#18+
Суть топика - Гамлетовский выбор между null и std::optional. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 09:42 |
|
CookBook: вернуть из функции то, чего нет
|
|||
---|---|---|---|
#18+
Как можно вернуть nullprt ссылкой? Ссылка должна быть проиничена. Ну и, не забывайте, проблема эргономичности не только внутри функции, но и снаружи. PS: про std::optional не знал, иду читать. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 09:44 |
|
CookBook: вернуть из функции то, чего нет
|
|||
---|---|---|---|
#18+
CEMbКак можно вернуть nullprt ссылкой? Я о том, чтобы возвращать указатель, а не ссылку. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 10:10 |
|
CookBook: вернуть из функции то, чего нет
|
|||
---|---|---|---|
#18+
название метода get не соответствует действительности. в действительности это метод find. Отсюда попытки натянуть сову на глобус :) Метод find может возвращать указатель, может optional, а вот метод get только бросать исключение(или ассерт на крайний случай) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 11:54 |
|
CookBook: вернуть из функции то, чего нет
|
|||
---|---|---|---|
#18+
алгоритмы stl вообще то итераторы возвращают вы так же по идее должны делать, если stl используете ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 15:00 |
|
CookBook: вернуть из функции то, чего нет
|
|||
---|---|---|---|
#18+
Мы не сможем ответить на этот вопрос разглядыва метод Код: plaintext 1.
как сферическую лошадь в космосе. Мы должны учесть что будут потреблять большинство методов которые caller по отношению к данному. Если итератор для них ОК - то это и будет решение. Если они хотят скалярную величину с проверкой на null или коробочку std:opt где есть протокол вскрытия с проверкой has_value или value_or. Это архитектурные вопросы которые надо смотреть в совокупности с юзкейсами всего проекта. А так - просто вкусовщина. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2019, 15:24 |
|
|
start [/forum/topic.php?fid=57&msg=39799168&tid=2017633]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 146ms |
0 / 0 |