c++ - 用 C++ 概念 TS 描述谓词

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

想象一下 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 吗?)

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

有没有一种方法可以实现这样一个概念,即对于采用一个或多个任何类型参数但未明确指定类型的函数对象返回true

最佳答案

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无法检查 P 之间的指定约束和 A ,这就是概念的用途。

关于c++ - 用 C++ 概念 TS 描述谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41418506/

相关文章:

c++ - std::function 是否支持自定义分配器?

compiler-errors - cmake/make - 无法识别的命令行选项 "-std=c++14"- 但 G++ 可以

c++ - 不是可执行格式 : File format not recognized GDB

c++ - Visual C++ 2010 错误。运行 LibICP 时系统找不到指定的文件

c++ - 如何在 C++ 中调用默认模板函数参数?

c++ - 带有 stdenable_if 的嵌套名称说明符中使用的不完整类型

C++ 类 vector 问题

在嵌套匿名结构上忽略 C++ 私有(private)修饰符

c++ - 在没有宏的情况下在 C++98 中创建类型列表时遇到问题

c++ - 测量函数的执行时间