在另一个概念的 '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); }
这些形式中的每一个都是等价的。
我有一个相当简单的例子,我正在努力解决。我想在另一个概念的 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); }
这些形式中的每一个都是等价的。