Код: Выделить всё
class MyClass {
public:
enum class error {
e1 // ...
};
using index_return_type = std::expected;
index_return_type add_data(data d);
index_return_type update_data(data d);
private:
std::expected expand_to_fit(data) {
// Imagine i fail here
return std::unexpected{error::e1};
}
};
Код: Выделить всё
index_return_type add_data(data d) {
if (auto it_fit = expand_to_fit(d); !it_fit) {
return std::unexpected{it_fit.error()};
}
// The rest of the function
}
Но мне это не нравится.
- Имя it_fit произвольное, что, если оно подошло бы, но функцияexpand_to_fit не удалась по другим причинам? Это делает этот код трудным для чтения (и немного обманчивым).
- Эргономика этой маленькой проверки кажется немного грубой, так как ее приходится писать по всему коду, и это усложняет код. читайте imo.
Чтобы расширить это, представьте, что у меня есть серия коротких проверок. Если бы я использовал исключения, у меня могло бы быть что-то вроде:
Код: Выделить всё
void expand_to_fit(data) {
if (!connected_to_database()) {
throw std::runtime_error("Lost connection");
}
if (has_data(data)) {
throw std::runtime_error("Duplicate");
}
if (!is_input_in_max_range(data)) {
throw std::runtime_error("Cannot fit");
}
// ... Rest of function
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... call-stack
Мобильная версия