
Constantine
25.09.2018
21:11:06
У меня есть принципиально три пути

Roman
25.09.2018
21:11:18
ну как альтернатива optional
но в optional не написано почему не получилось

Constantine
25.09.2018
21:11:58
Я могу её вернуть, могу передать параметр обработки и могу бросить исключение, если файла нет

Google

Constantine
25.09.2018
21:12:46
Путь (2) замечательный, если по жизни пустой файл уже ошибка
Вопрос в том, что путь 3 ужасен
Если задуматься, то нет никакой валидации, что я проверяю, что функция вообще умеет бросать это исключение

Roman
25.09.2018
21:14:52
Да, а теперь представьте ситуацию когда у вас очень сложная система и исключение происходит глубоко по call стеку от потребителя

Constantine
25.09.2018
21:15:15
И что?

Roman
25.09.2018
21:15:30
Тогда чтобы меньше колотить удобно использовать исключения
Хотя это и порождает проблемы с энфорсом try

Constantine
25.09.2018
21:15:57
Но это же все равно, что вернуть std::any из функции

Roman
25.09.2018
21:17:31

Constantine
25.09.2018
21:17:49
Ну т.е. функция все еще может возвращать объект любого типа!
У вас нет информации о её возврате

Alexander
25.09.2018
21:18:26
ты хочешь такую проверку встроенную в язык?

Roman
25.09.2018
21:18:27
да, в этом месте хотелось бы сделать какой-нибудь checked exception

Google

Alexander
25.09.2018
21:18:52

Roman
25.09.2018
21:19:12
да, недостатки известны и везде уже отказались от них

Constantine
25.09.2018
21:19:33
т.е. все проблемы что я не могу синтаксически записать конструкцию, которая вернет некоторое значение из функции

Roman
25.09.2018
21:21:06

Constantine
25.09.2018
21:21:50
Т.е. нельзя
auto a = try try_get_a();
а надо
auto try_a = try_get_a();
if (is_fail(try_a))
return bypass_fail(std::move(try_a));
auto a = /**/(std::move(try_a));

J
25.09.2018
21:23:27
как проще всего unicode строку перевести в cp1251?

Constantine
25.09.2018
21:23:55

Roman
25.09.2018
21:23:55

Constantine
25.09.2018
21:24:07

J
25.09.2018
21:24:13
нагуглил варианты, но как-то странно работают, то переводят, то нет

Constantine
25.09.2018
21:24:17
return должен произойти, как в случае выброшенного исключения

Roman
25.09.2018
21:24:37
А, ну вот expected именно оно и есть

Constantine
25.09.2018
21:24:52
Так это функциональный возврат и есть

Roman
25.09.2018
21:24:58
Вот так (вроде ) будете писать: auto a = * try_get_a();

Constantine
25.09.2018
21:25:07
Там же не исключение бросить, а вернуть

Roman
25.09.2018
21:25:31

Alex Фэils?︙
25.09.2018
21:25:53

Roman
25.09.2018
21:25:57
как вы хотите описать то что должно произойти

Google

Constantine
25.09.2018
21:25:59
не понял
operator try примененный к expected должен проверить, что случай ОК, в противном случае вернуть (return) ошибку из функции
да как угодно

J
25.09.2018
21:26:32
если что, под windows

Roman
25.09.2018
21:27:38

Constantine
25.09.2018
21:28:07
но это ОБС (или ОАС?)
а дальше там идет реализация "почти variant" типа expected<OkType, type_base_set<PossibleExceptions>>
и все идеальнейше работает

J
25.09.2018
21:29:46

Constantine
25.09.2018
21:30:44

Roman
25.09.2018
21:32:00

Dmitry
25.09.2018
21:34:05

Constantine
25.09.2018
21:36:32
Не понял
load_string имеет конвенцию (<источник>, <теги>) -> string
где источник это поток byte-ов
возможные ошибки это ошибки источника и ошибки перекодировщика

Roman
25.09.2018
21:39:51
ладно, я не понимаю проблематики, такое api мне кажется искуственным.

Constantine
25.09.2018
21:40:20

Roman
25.09.2018
21:41:16
не сталкивался с острой практической необходимостью делать такие обобщения

Constantine
25.09.2018
21:42:15
вообще вы удивитесь, но человеческий язык именно этими обобщениями и оперирует
load_string(file) или load_string(vector) это буквально русский язык

Google

Roman
25.09.2018
21:43:53
да, но в том месте где я получаю эту строку я скорей всего уже не захочу знать что именно сломалось
если же захочу, то думаю какой-нибудь optional с enum кода ошибки вместо bool меня бы устроил

Constantine
25.09.2018
21:44:45

Roman
25.09.2018
21:47:03
ну вот получается что load_file и load_vector сильно различаются семантически

Constantine
25.09.2018
21:47:19
не вижу
load_string это метод буквально следующего вида
auto data = try load_data(источник)
return decode(data, теги)

Alexander
25.09.2018
21:51:41
не нужен

Roman
25.09.2018
21:52:05
Почти не использую

Alexander
25.09.2018
21:52:09
и преподу скажи, что никому метод show не нужен

PRoSToC0der
25.09.2018
22:53:05

Alex Фэils?︙
25.09.2018
22:53:58
Чем вам текущие не нравятся

PRoSToC0der
25.09.2018
22:54:58
ибо эррор коды не удобно использовать

Alex Фэils?︙
25.09.2018
22:55:32
exception func()
{
return exception("wat");
}

PRoSToC0der
25.09.2018
22:55:32
получается какой-то rust

Alex Фэils?︙
25.09.2018
22:55:41
Или C/Go
А чем вам expected тогда не по нраву? Это ж как раз оно и есть

PRoSToC0der
25.09.2018
22:57:25
а с исключениями засунул в try всё и в catch ловишь

Google

PRoSToC0der
25.09.2018
23:00:34
хотя там ещё у Александреску было интересное выступление по поводу SCOPE_*, но оно по сути тоже на исключениях, просто без try-catch
https://www.youtube.com/watch?v=WjTrfoiB0MQ

Ioann V
25.09.2018
23:06:37
да все ок с эксепшенами в цхх. Все вроде логично, кроме некоторых редких вещей.

PRoSToC0der
25.09.2018
23:08:26

Alexander
25.09.2018
23:08:43
@supapro
Жди

PRoSToC0der
25.09.2018
23:16:59

Constantine
25.09.2018
23:18:12

Igor
25.09.2018
23:19:39

PRoSToC0der
25.09.2018
23:20:09

Constantine
25.09.2018
23:31:15