28

私は自分の 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; },
}
4

4 に答える 4

36

optional<T>Tは、と 無 ( )の非対称型の安全な和集合ですnullopt_tTwithがあるかどうかを照会し、 unaryexplicit operator boolで取得できます。非対称性は、オプションが aであることを「好む」ことを意味します。これが、修飾されていない操作 (または 演算子 bool など) がその性質を参照する理由です。T*T*T

variant<A,B,C>from paper n4218は、ABand C(etc) の対称型の安全な和集合です。 boost::variant常に従事しており、std::experimental::variantほとんど常に従事しています。

*対称であるため、単項が返す一意の型はなくexplicit operator bool、あまり興味深いことを言うことができないため、どちらもサポートされていません。

代わりに、アクセスするか、特定のタイプを照会する必要があります。

std::experimental::expected<E, T>紙から n4015は、非対称タイプセーフ共用体です。TまたはのいずれかEです。しかし、のようoptionalに、それは ; であることが「優先」されますT。であるexplicit operator boolかどうかを示す がありT、単項*は を取得しTます。

はある意味でexpected<E,T>は ですoptional<T>が、空の場合は、スペースを無駄にする代わりに、E照会できる を格納します。

Result<T,E>に近いようですexpected<E,T>(n4015 の時点で、パラメータの順序が とは入れ替わっていることに注意してくださいResult)。

于 2015-08-20T20:22:42.707 に答える
4

optional設計上、何らかのタイプの値を含むか、何も含まないかのいずれかです。

のようなものを探しているかもしれませんBoost::Variant

これはまだ標準ライブラリの一部ではありませんが、最終的には標準ライブラリの一部になる可能性があります。

于 2015-08-20T19:27:58.213 に答える