在另一个概念的 'requires' 子句中使用一个概念

Using a concept in another concept's 'requires' clause

我有一个相当简单的例子,我正在努力解决。我想在另一个概念的 requires 子句中使用一个已经定义的概念——像这样,除了实际工作:

template<typename T>
concept Any = true;

template<typename T>
concept UsesAnyA = requires(T t, Any auto a) {
  t(a);
};

我也试过像这样定义 UsesAny,但无济于事:

template<typename T, Any A>
concept UsesAnyB = requires(T t, A a) {
  t(a);
};

从概念(...抱歉)的角度来看,感觉这应该是可能的。谁能推荐一下?

可能需要做这样的事情:

template <typename T>
concept Any = true;

template <typename T, typename A>
concept UsesAny = Any<A> and requires (T t, A a) {
  t(a);
};

一个概念需要涉及的每个完整类型才能测试其约束,但在您对其进行评估时,您应该已经拥有可用于测试的完整类型。

我意识到在这个例子中检查 Any<A> 是多余的,但我假设你的实际概念不是微不足道的,这演示了如何使用它来约束你的依赖概念。

以下是您可以使用 UsesAny 约束模板的三种不同方式:

template <typename A>
auto f(A a, UsesAny<A> auto t) { t(a); }

template <typename A, UsesAny<A> T>
auto f(A a, T t) { t(a); }

template <typename A, typename T>
requires UsesAny<T, A>
auto f(A a, T t) { t(a); }

这些形式中的每一个都是等价的。