powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / CookBook: вернуть из функции то, чего нет
8 сообщений из 8, страница 1 из 1
CookBook: вернуть из функции то, чего нет
    #39799122
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим, у нас в классе есть map<A, B>

И нам надо сделать функцию поиска и возвращения значения из этой мапы:

Код: plaintext
1.
2.
3.
4.
5.
6.
const B& Class::Get (const A& a) const
{
	map<A, B>::const_iterator it = Map.find(a);
	if (it != Map.cend())
		return it->second;
}



А как быть, если мы ничего не нашли?

1. Бросить исключение. Но тогда на каждый Get придётся в коде делать try-catch, и про это надо будет постоянно помнить. С другой стороны, нам всё равно возвращаемое значение надо как-то проверить, что оно "непустое", а exception нас от этого избавляет.

2. Завести внутри функции static B bEmpty = {0} и возвращать её. Но как-то не сильно красиво, да? Если будет у меня 5 функций в классе, которые что-то возвращают, то будет в памяти пять статических переменных.

2.1. Завести в классе B статическую "пустую" переменную. Но тогда map<int, string> печалится.

3. Возвращать значение вместо ссылки. Но тогда будет вызываться конструктор на каждый Get.

4. Передавать ссылку на B вторым параметром. Некрасиво и всё равно надо будет проверять на "пустоту".

Получается, что все пункты, кроме первого, требуют проверку на "пустоту", но иногда "пустое" значение тоже валидно для кода. Например, вывод пустой строки в статусе.

Кто как делает? Может есть какое-то истинно верное единственное решение? :)
...
Рейтинг: 0 / 0
CookBook: вернуть из функции то, чего нет
    #39799134
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Под капотом" ссылка -- это указатель, почему его не возвращать, или nullptr.
Если есть возможность, можешь возвращать std::optional<std::reference_wrapper<B>>{it->second}
в случае успеха или std::nullopt.
...
Рейтинг: 0 / 0
CookBook: вернуть из функции то, чего нет
    #39799168
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Суть топика - Гамлетовский выбор между null и std::optional.
...
Рейтинг: 0 / 0
CookBook: вернуть из функции то, чего нет
    #39799171
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как можно вернуть nullprt ссылкой? Ссылка должна быть проиничена.

Ну и, не забывайте, проблема эргономичности не только внутри функции, но и снаружи.

PS: про std::optional не знал, иду читать.
...
Рейтинг: 0 / 0
CookBook: вернуть из функции то, чего нет
    #39799186
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbКак можно вернуть nullprt ссылкой?
Я о том, чтобы возвращать указатель, а не ссылку.
...
Рейтинг: 0 / 0
CookBook: вернуть из функции то, чего нет
    #39799240
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
название метода get не соответствует действительности.
в действительности это метод find.
Отсюда попытки натянуть сову на глобус :)
Метод find может возвращать указатель, может optional, а вот метод get только бросать исключение(или ассерт на крайний случай)
...
Рейтинг: 0 / 0
CookBook: вернуть из функции то, чего нет
    #39799405
Фотография tehKosh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
алгоритмы stl вообще то итераторы возвращают
вы так же по идее должны делать, если stl используете
...
Рейтинг: 0 / 0
CookBook: вернуть из функции то, чего нет
    #39799430
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы не сможем ответить на этот вопрос разглядыва метод
Код: plaintext
1.
Class::Get (const A& a) const


как сферическую лошадь в космосе. Мы должны учесть что будут потреблять
большинство методов которые caller по отношению к данному. Если итератор
для них ОК - то это и будет решение. Если они хотят скалярную величину
с проверкой на null или коробочку std:opt где есть протокол вскрытия с
проверкой has_value или value_or. Это архитектурные вопросы которые надо
смотреть в совокупности с юзкейсами всего проекта.

А так - просто вкусовщина.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / CookBook: вернуть из функции то, чего нет
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]