Мне нравится использовать std :: experimental :: optional в моем коде на C++, но проблема value_or требует, чтобы значение по умолчанию имело тот же тип, что и значение опциона.C++ эквивалент результата Rust <T, E> type?
Это не очень хорошо, если я хочу, чтобы он был опциональным, либо содержит int, либо содержит сообщение об ошибке.
Я думаю, я мог бы использовать структуру union, которая имеет логическое значение, чтобы указать, существует ли значение или это ошибка, но было бы неплохо, если бы у C++ был тип Result<T, E>
, такой как Rust.
Есть ли такой тип? Почему Boost не реализовал его?
Результат действительно намного полезнее, чем вариант, и, несомненно, люди в Boost знают о его существовании. Может быть, я пойду прочитаю реализацию Rust, а затем скопирую ее на C++?
Ex:
// Function either returns a file descriptor for a listening socket or fails
// and returns a nullopt value.
// My issue: error messages are distributed via perror.
std::experimental::optional<int> get_tcp_listener(const char *ip_and_port);
// You can use value_or to handle error, but the error message isn't included!
// I have to write my own error logger that is contained within
// get_tcp_listener. I would really appreciate if it returned the error
// message on failure, rather than an error value.
int fd = get_tcp_listener("127.0.0.1:9123").value_or(-1);
// Rust has a type which does what I'm talking about:
let fd = match get_tcp_listener("127.0.0.1:9123") {
Ok(fd) => fd,
Err(msg) => { log_error(msg); return; },
}
Возможно, предложенный 'std :: expected' или другой тип« Ожидаемый », который был реализован. – chris
Выражение в C++ должно иметь тип, известный во время компиляции; он не может быть ни «int», ни строкой. –
Как одно полезнее, чем другое, когда они решают полностью не связанные, ортогональные проблемы? Является ли 'vector' более полезным, чем' cout'? – Barry