让我描述一个场景,首先我们有一个函数,它返回一些我们无法确定其有效性的数据,即
auto random_predicate() -> bool
{
int v = uniform_dist(e1); // uniform distribution 1 to 100
return (v % 5);
}
Run Code Online (Sandbox Code Playgroud)
其中uniform_dist()是适当种子的均匀分布,我们有一个enum class将用于错误处理的,即
enum class Error
{
ValueError
};
Run Code Online (Sandbox Code Playgroud)
然后我们执行某种基于视图的处理,该处理random_predicate()在操作中使用,如下所示:
std::vector<int> vs{1,2,3,4,5};
auto result = vs
| views::filter([](int i){ return i % 2; })
| views::transform([](int i) -> std::expected<int, Error> {
auto v = random_predicate();
if (v) return std::unexpected<Error>(Error::ValueError);
else return i * i;
});
Run Code Online (Sandbox Code Playgroud)
因此,在该操作结束时,我们可以断言
static_assert(
std::is_same_v<
std::decay_t<std::ranges::range_value_t<result>>,
std::expected<int, Error>
>
)
Run Code Online (Sandbox Code Playgroud)
事实上将会是真的。 …