在 C++ 约束中引入变量
Introduce variable in a C++ constraint
给定结构上的 require 块,例如这个
template<typename A, typename B, typename C>
struct MyOtherTypeLevelFunction<A, B, C>;
template<typename A, typename B, typename C> requires
(MyConcept<MyTypeLevelFunction<A, B, C>>)
&& (MyOtherConcept<MyTypeLevelFunction<A, B, C>>)
struct MyOtherTypeLevelFunction<A, B, C> {
using Output = MyTypeLevelFunction<A, B, C>::T;
}
是否可以引入一个变量来避免重复调用 MyTypeLevelFunction
?理想情况下,在 requires
块和结构体中。我尝试了以下操作,但失败并显示 Default template argument in a class template partial specialization
.
template<typename A, typename B, typename C>
struct MyOtherTypeLevelFunction<A, B, C>;
template<typename A, typename B, typename C, typename X = MyTypeLevelFunction<A, B, C>> requires
(MyConcept<X>)
&& (MyOtherConcept<X>)
struct MyOtherTypeLevelFunction<A, B, C> {
using Output = X::T;
}
即使默认模板参数有效,它也不会很酷,因为它可以被用户覆盖。
你可以这样做:
template <typename A, typename B, typename C>
requires requires(MyTypeLevelFunction<A, B, C> x)
{
requires MyConcept<decltype(x)> && MyOtherConcept<decltype(x)>;
}
struct MyOtherTypeLevelFunction<A, B, C>
{
using Output = MyTypeLevelFunction<A, B, C>::T;
};
您可以创建一个组合概念:
template <typename F>
concept MyCombinedConcept = MyConcept<F> && MyOtherConcept<F>;
template<typename A, typename B, typename C>
requires MyCombinedConcept<MyTypeLevelFunction<A, B, C>>
struct MyOtherTypeLevelFunction<A, B, C> {
using Output = MyTypeLevelFunction<A, B, C>::T;
}
如果是实现细节,可以选择将 MyCombinedConcept
放入 detail
命名空间。
给定结构上的 require 块,例如这个
template<typename A, typename B, typename C>
struct MyOtherTypeLevelFunction<A, B, C>;
template<typename A, typename B, typename C> requires
(MyConcept<MyTypeLevelFunction<A, B, C>>)
&& (MyOtherConcept<MyTypeLevelFunction<A, B, C>>)
struct MyOtherTypeLevelFunction<A, B, C> {
using Output = MyTypeLevelFunction<A, B, C>::T;
}
是否可以引入一个变量来避免重复调用 MyTypeLevelFunction
?理想情况下,在 requires
块和结构体中。我尝试了以下操作,但失败并显示 Default template argument in a class template partial specialization
.
template<typename A, typename B, typename C>
struct MyOtherTypeLevelFunction<A, B, C>;
template<typename A, typename B, typename C, typename X = MyTypeLevelFunction<A, B, C>> requires
(MyConcept<X>)
&& (MyOtherConcept<X>)
struct MyOtherTypeLevelFunction<A, B, C> {
using Output = X::T;
}
即使默认模板参数有效,它也不会很酷,因为它可以被用户覆盖。
你可以这样做:
template <typename A, typename B, typename C>
requires requires(MyTypeLevelFunction<A, B, C> x)
{
requires MyConcept<decltype(x)> && MyOtherConcept<decltype(x)>;
}
struct MyOtherTypeLevelFunction<A, B, C>
{
using Output = MyTypeLevelFunction<A, B, C>::T;
};
您可以创建一个组合概念:
template <typename F>
concept MyCombinedConcept = MyConcept<F> && MyOtherConcept<F>;
template<typename A, typename B, typename C>
requires MyCombinedConcept<MyTypeLevelFunction<A, B, C>>
struct MyOtherTypeLevelFunction<A, B, C> {
using Output = MyTypeLevelFunction<A, B, C>::T;
}
如果是实现细节,可以选择将 MyCombinedConcept
放入 detail
命名空间。