gpt4 book ai didi

c++ - 如何简洁地表达包含 T 类型值的范围的 C++20 概念?

转载 作者:行者123 更新时间:2023-12-04 15:07:13 25 4
gpt4 key购买 nike

我想编写一个接受范围 MyType 的函数模板-typed 值,所以我写

void f(const std::ranges::range auto& my_range) { /* ... */ }
不幸的是,这并不限制范围内包含的值的类型。我可以使用 requires函数体块之前的子句,但我想要一些可重用的而不是特定于这个函数的东西。
自然而然地写了
template <class T, class V>
concept range_of = std::ranges::range<T> && std::is_same_v<V, std::ranges::range_value_t<T>>;

void f(const range_of<MyType> auto& my_range) { /* ... */ }
但令我感到非常惊讶的是,鉴于它看起来多么自然,标准库并不支持开箱即用。这也适用于 std::ranges::view我可以为此写一个类似的 view_of概念。
是我定义的 range_of不完整或错误?或者标准库不提供这是否有充分的理由?

最佳答案

这里的问题是:您想要的实际约束是什么?
你想要_____吗:

  • 限制范围的值类型特别是 T ?
  • 限制范围的值类型可转换为 T ?
  • 约束满足其他一些概念的范围值类型,C ?
  • 以上任何一项,而是关于范围的引用类型?

  • 不同的上下文需要不同的版本。您的 range_of概念是其中第一个的完美实现(可以使用 std::same_as 而不是 std::is_same_v 但并不重要)。但是当你想要别的东西时会发生什么?约束的具体选择将在很大程度上取决于您想要做什么。
    所以直接的答案是:没有 range_of概念,因为对于该概念应该做什么,确实没有一个真正的答案。

    一个不同的答案是,这甚至不是有用的。有用的是直接提取给定 range 的关联类型的方法。以便于对它们添加进一步的约束。
    例如,如果我们采用 Rust,我们可以定义一个采用任意迭代器的函数:
    fn foo<I: Iterator>(it: I) { ... }
    这有点类似于 void f(range auto) .这是一个约束,但不是一个非常有用的约束。但是 Iterator在 Rust 中,有一个关联类型:它的 Item .所以如果你想要一个 Iterator在特定类型上,即:
    fn foo<I: Iterator<Item=i32>>(it: I) { ... }
    如果您想要一个 Iterator其类型满足其他一些约束:
    fn foo<T: Debug, I: Iterator<Item=T>>(it: I) { ... }
    而这正是我们真正缺乏的能力——提取关联类型并直接限制它们。

    关于c++ - 如何简洁地表达包含 T 类型值的范围的 C++20 概念?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65894358/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com