小编Jon*_*h F的帖子

在 C++23 中将 std::ranges/std::views 与 std::expected 一起使用的最佳方法是什么?

让我描述一个场景,首先我们有一个函数,它返回一些我们无法确定其有效性的数据,即

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)

事实上将会是真的。 …

c++ c++20 c++23

7
推荐指数
1
解决办法
1246
查看次数

标签 统计

c++ ×1

c++20 ×1

c++23 ×1