用 C++ 概念 TS 描述谓词

Describing Predicate with C++ Concepts TS

想象一下 std::all_of 在未来的 C++ 标准中的实现:

// constraining InputIt doesn't concern this question
template<typename InputIt, typename Pred>
bool all_of(InputIt first, InputIt last, Pred pred)
    requires Predicate<Pred, decltype(*first)>() 
    // requires Predicate<Pred>() // this would accept any, would like this
{
    for (; first != last; ++first)
        if (!pred(*first))
            return false;
    return true;
}

其中概念Predicate定义为:

template<typename Pred, typename Param>
concept bool Predicate()
{
    return requires(Pred p, Param a) {
        { p(a) } -> bool;
    };
}

这显然符合预期。 (还有当函数对象有默认参数时,但从技术上讲这不仍然是一个 UnaryPredicate 吗?)

无论如何,必须指定谓词接受的类型有时会是一个负担。

有没有一种方法可以实现这样一个概念,即 return true 函数对象采用一个或多个 any 类型的参数,其中类型没有明确规定?

Is there a way to implement such a concept which would return true for function objects taking one or more parameters of any type where the type isn't explicitly specified?

我认为没有合理的表达方式。也许通过反射提议,可以检查函数对象是否仅接受 auto 或等效的普通模板参数 T.

的参数

关于:

// requires Predicate<Pred>() // this would accept any, would like this

概念测试类型的属性,因此您实际上需要指定参数类型 A,类型 P 应满足 Predicate<P,A>()。如果您可以在不指定 A 的情况下执行此操作,则 Predicate 无法检查 PA 之间的指定约束,这就是概念的用途。