私は自分の C++ コードで std::experimental::optional を使用するのが好きですが、問題は value_or であり、デフォルト値がオプションの値と同じ型である必要があります。
int を含むか、エラー メッセージを含むオプションが必要な場合、これはうまく機能しません。
値が存在するかエラーであるかを示すブール値を持つ共用体構造体を使用できると思いますが、C++ にResult<T, E>
Rust のような型があればいいのにと思います。
そのようなタイプはありますか?Boost がそれを実装していないのはなぜですか?
Result は Option よりもはるかに有用であり、Boost の人々は確かにその存在を認識しています。Rust の実装を読んで、それを C++ にコピーしてみませんか?
元:
// 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; },
}