lambda与模板

inf*_*inf 5 c++ lambda templates c++11

我目前正在做一些带有模板化功能的练习.我的任务是编写变换算法的实现.我做了以下这样的工作:

template <class in, class out, class T>
out stransform(in b, in e, out d, T p(const T&)) {
    while (b != e) 
        *d++ = p(*b++);
    return d;
}
Run Code Online (Sandbox Code Playgroud)

与正常变换一样,我必须使用类似的显式类型来调用谓词

stransform(begin(vec1), end(vec1), back_inserter(vec2), predi<double>);
Run Code Online (Sandbox Code Playgroud)

现在,我偶然发现了C++ 11 Lambdas,想要调用我的函数:

stransform(begin(vec1), end(vec1), back_inserter(vec2), [] (double x) ->double {return x * 10;} );
Run Code Online (Sandbox Code Playgroud)

有了这个,我确实得到了一个编译器错误,该类型无法推断出来.这是我不理解的事情,因为我实际上在我的lambda中定义了T类型两次.

我还检查了它正在使用的原始转换函数.然后我检查了那个的实现,它显然是用整个函数的模板类实现的.这是使用模板实现谓词的正确方法吗?

vis*_*tor 13

谓词通常是一个简单的模板参数:

template <class in, class out, class UnaryPredicate>
out stransform(in b, in e, out d, UnaryPredicate p); 
Run Code Online (Sandbox Code Playgroud)

这将接受指向函数,lambdas和函数对象的指针.

  • @visitor:lambda的类型是*unknown*类类型,它为已定义的参数实现`operator()`并返回相同的返回类型.在没有捕获任何东西的lambda的特定情况下(并且只有那时)它可以转换为具有相同签名的函数指针,但是***如果lambda根本不捕获任何东西. (6认同)
  • @bamboon我想因为lambda不是函数而是函数对象,因为它也可以保持状态(它是一个闭包而不仅仅是一个函数). (5认同)