C ++ lambda,"错误:期望的表达"

时间:2016-09-04 16:27:14

标签: c++ lambda

我试图用C ++重现java的流API,到目前为止已经制作了这个程序。

#include <iostream>

using namespace std;

template <typename E>
class stream {
    virtual void collect(void (*consumer) (E)) = 0;
    virtual bool anyMatch(bool (*predicate) (E)) {
        bool found = false;
        collect([&found](E obj) -> { if (predicate(obj)) {found = true} });
        return found;
    }
};

int main() {
    return 0;
}

但是当我尝试用g ++编译它时:

enter image description here

我做错了什么?它应该提供一个函数(使用者),它将使用谓词(函数)测试给定的E,如果它产生true,则将find设置为true。

1 个答案:

答案 0 :(得分:1)

您的代码中存在一些单独的问题:

  1. 您发布的错误表明您正在以C ++ 11之前的模式进行编译。 Lambdas是在C ++ 11中引入的。

  2. 有几种语法错误。你的lambda尾随返​​回类型缺少类型,并且你在lambda的主体中缺少一个分号。

  3. 您正在尝试将非无捕获的lambda转换为函数指针。这是不可能的,因为捕获变量需要状态/上下文。

  4. 您的代码无效C ++ - 语法不正确。这是a version with valid syntax

    template <typename E>
    class stream
    {
        virtual void collect(void (*consumer)(E)) = 0;
        virtual bool anyMatch(bool (*predicate)(E))
        {
            bool found = false;
            collect([predicate, &found](E obj)
                {
                    if(predicate(obj))                    
                        found = true;                    
                });
    
            return found;
        }
    };
    

    然而,代码无法编译,因为非无捕获的lambdas无法转换为函数指针。如果允许这样做,那将是一个灾难的处方,因为有关捕获的变量的信息将丢失。 You can instead use std::function,它以内存/运行时开销为代价擦除lambda的类型并使用非空捕获列表:

    template <typename E>
    class stream
    {
        virtual void collect(std::function<void(E)> consumer)
        {
            (void)consumer;
        }
    
        virtual bool anyMatch(std::function<bool(E)> predicate)
        {
            bool found = false;
            collect([predicate, &found](E obj)
                {
                    if(predicate(obj))                    
                        found = true;                    
                });
    
            return found;
        }
    };