用C++概念描述谓词 TS.

Describing Predicate with C++ Concepts TS

本文关键字:谓词 TS 描述 C++      更新时间:2023-10-16

想象一下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;
    };
}

这显然按预期工作。(同样当函数对象具有默认参数时,但从技术上讲,这仍然不是一元谓词吗?

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

有没有办法实现这样一个概念,它将为函数对象返回true,该函数对象采用一个或多个未显式指定类型的任何类型的参数?

有没有办法实现这样一个概念,对于采用一个或多个未显式指定类型的任何类型的参数的函数对象返回 true?

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

关于:

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

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