C++20 概念:多个 return 类型要求?

C++20 concepts: multiple return type requirements?

我想实现一个concept,其中有多个return类型的成员函数。

例如:

template<typename C>
concept Container = requires(C a) {
    {a.begin()} ->
        std::same_as<typename C::iterator> ||
        std::same_as<typename C::const_iterator>;
};

上面的代码强制 a.begin() 的 return 类型为 C::iteratorC::const_iterator

但是编译不了。

还有其他方法吗?

使用无糖形式。

template<typename C>
concept Container = requires(C a) {
    requires std::same_as<decltype(a.begin()), typename C::iterator> ||
      std::same_as<decltype(a.begin()), typename C::const_iterator>;
};

您可以编写一个概念来测试该类型是否是容器的迭代器类型之一:

template<typename It, typename Container>
concept is_container_iterator =
    same_as<It, typename Container::iterator> || same_as<It, typename Container::const_iterator>;

然后您可以在代码中使用该概念:{a.begin()} -> is_container_iterator<C>;