在 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 命名空间。