- expected[meta header]
- function template[meta id-type]
- std[meta namespace]
- expected.void[meta class]
- cpp23[meta cpp]
// expected<cv void, E>部分特殊化
template<class F> constexpr auto transform(F&& f) &; // (1)
template<class F> constexpr auto transform(F&& f) const &; // (2)
template<class F> constexpr auto transform(F&& f) &&; // (3)
template<class F> constexpr auto transform(F&& f) const &&; // (4)正常値を保持していれば、fの呼び出し結果をexpectedの正常値として格納して返す。
エラー値を保持していれば、そのまま返す。
実際には複数オーバーロードが提供されるが、大まかには下記シグニチャのようにみなせる。
transformへは、引数をとらずReturn型を返す関数や関数オブジェクトを与える。
template <cv void, class E>
class expected {
template <class Return>
std::expected<Return, E> transform(function<Return()> func);
};- function[link /reference/functional/function.md]
- (1), (2) :
is_copy_constructible_v<E> == true - (3), (4) :
is_move_constructible_v<E> == true
- (1), (2) : 型
Uをremove_cvref_t<invoke_result_t<F>>としたとき、次を全て満たすことUがexpectedの有効な正常値型であるUが(CV修飾された)voidではないとき、宣言U u(invoke(std::forward<F>(f)));が妥当である
- (3), (4) : 型
Uをremove_cvref_t<invoke_result_t<F>>としたとき、次を全て満たすことUがexpectedの有効な正常値型であるUが(CV修飾された)voidではないとき、宣言U u(invoke(std::forward<F>(f)));が妥当である
- (1), (2) : 次の効果をもつ
- エラー値を保持していたら、
expected<U, E>(unexpect,error())を返す。 - 型
Uが(CV修飾された)voidでなければ、正常値をinvoke(std::forward<F>(f))で直接非リスト初期化したexpected<U, E>オブジェクトを返す。 - そうでなければ、
invoke(std::forward<F>(f))を評価し、expected<U, E>()を返す。
- エラー値を保持していたら、
- (3), (4) : 次の効果をもつ
- エラー値を保持していたら、
expected<U, E>(unexpect,std::move(error()))を返す。 - 型
Uが(CV修飾された)voidでなければ、正常値をinvoke(std::forward<F>(f))で直接非リスト初期化したexpected<U, E>オブジェクトを返す。 - そうでなければ、
invoke(std::forward<F>(f))を評価し、expected<U, E>()を返す。
- エラー値を保持していたら、
transformは、メソッドチェーンをサポートするモナド風(monadic)操作として導入された。
#include <cassert>
#include <expected>
#include <string>
int get_answer()
{
return 42;
}
int main()
{
std::expected<void, std::string> v1;
assert(v1.transform(get_answer).value() == 42);
std::expected<void, std::string> e1 = std::unexpected{"galaxy"};
assert(e1.transform(get_answer).error() == "galaxy");
}- transform[color ff0000]
- value()[link value.md]
- error()[link error.md]
- std::unexpected[link ../unexpected.md]
- C++23
- Clang: ??
- GCC: 13.0 [mark verified]
- ICC: ??
- Visual C++: ??