Как бы вы использовали ожидаемый <T> Александреску с пустыми функциями?
Поэтому я наткнулся на эту (ИМХО) очень хорошую идею использования составной структуры возвращаемого значения и исключения -Expected
, Это преодолевает многие недостатки традиционных методов обработки ошибок (исключения, коды ошибок).
УвидетьАндрей Александрескуs talk (Систематическая обработка ошибок в C ++) а такжеего слайды.
Исключения и коды ошибок имеют в основном те же сценарии использования с функциями, которые возвращают что-то, и теми, которые нет.Expected
с другой стороны, похоже, что он предназначен только для функций, которые возвращают значения.
Итак, мои вопросы:
Кто-нибудь из вас пробовалExpected
на практике?Как бы вы применили эту идиому к функциям, ничего не возвращающим (то есть к пустым функциям)?Обновить:
Я думаю, я должен уточнить мой вопрос.Expected
специализация имеет смысл, но яМеня больше интересует, как это будет использоваться - идиома последовательного использования. Сама реализация вторична (и проста).
Например, Александреску приводит этот пример (немного отредактированный):
string s = readline();
auto x = parseInt(s).get(); // throw on error
auto y = parseInt(s); // won’t throw
if (!y.valid()) {
// ...
}
Этот код "чистый» таким образом, что это просто течет естественно. Нам нужна ценность - мы ее получаем. Однако сexpected
нужно было бы перехватить возвращаемую переменную и выполнить с ней некоторую операцию (например,.throwIfError()
или что-то), что не так элегантно. И, очевидно,.get()
Безразлично»не имеет смысла с пустотой.
Итак, как бы выглядел ваш код, если бы у вас была другая функция, скажемtoUpper(s)
, который изменяет строку на месте и не имеет возвращаемого значения?