用C ++概念描述谓词TS

时间:2017-01-01 19:59:15

标签: c++ templates c++14 c++-concepts

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

// 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吗?)

无论如何,必须指定谓词所接受的类型有时会成为负担。

有没有办法实现这样一个概念,它会为函数对象返回true,其中任何类型的一个或多个参数未明确指定类型?

1 个答案:

答案 0 :(得分:2)

  

有没有办法实现这样一个概念,这个概念对于函数对象返回true,它接受任何类型的一个或多个参数,其中未明确指定类型?

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

关于:

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

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