我试图用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 ++编译它时:
我做错了什么?它应该提供一个函数(使用者),它将使用谓词(函数)测试给定的E,如果它产生true,则将find设置为true。
答案 0 :(得分:1)
您的代码中存在一些单独的问题:
您发布的错误表明您正在以C ++ 11之前的模式进行编译。 Lambdas是在C ++ 11中引入的。
有几种语法错误。你的lambda尾随返回类型缺少类型,并且你在lambda的主体中缺少一个分号。
您正在尝试将非无捕获的lambda转换为函数指针。这是不可能的,因为捕获变量需要状态/上下文。
您的代码无效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;
}
};