Mi piace usare std :: experimental :: opzionale nel mio codice C++, ma il problema è value_or richiede che il valore predefinito sia dello stesso tipo del valore facoltativo.equivalente in C++ del risultato di Rust <T, E> tipo?
Questo non funziona molto bene quando voglio un opzionale che contiene un file int o contiene un messaggio di errore.
Suppongo che potrei usare una struttura unione che ha un valore booleano per indicare se il valore è presente o è un errore, ma sicuramente sarebbe bello se C++ avesse solo un tipo Result<T, E>
come Rust.
Esiste un tipo simile? Perché Boost non l'ha implementato?
Il risultato è davvero molto più utile di Option, e sicuramente le persone a Boost sono consapevoli della sua esistenza. Forse andrò a leggere l'implementazione di Rust e poi a copiarlo in C++?
Es:
// 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; },
}
Probabilmente il proposto 'std :: expected', o un altro tipo' Previsto' che qualcuno ha implementato. – chris
Un'espressione in C++ deve avere un tipo noto in fase di compilazione; non può essere né un 'int' né una stringa. –
In che modo una cosa è più utile di un'altra cosa quando risolvono problemi ortogonali completamente estranei? 'Vector' è più utile di' cout'? – Barry