我目前正在使用模板函数做一些练习。 我的任务是编写转换算法的实现。 我做了如下操作并且有效:
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;
}
与普通转换一样,我必须使用显式类型调用谓词
stransform(begin(vec1), end(vec1), back_inserter(vec2), predi<double>);
现在,我偶然发现了 C++11 Lambda,并想这样调用我的函数:
stransform(begin(vec1), end(vec1), back_inserter(vec2), [] (double x) ->double {return x * 10;} );
有了这个,我确实得到了一个编译器错误,无法推断出类型。 这是我不明白的地方,因为我实际上在我的 lambda 中定义了两次 T 类型。
我还检查了它正在使用的原始转换功能。然后我检查了 implementation那个,它显然是用一个模板类来实现整个功能的。 这是使用模板实现谓词的正确方法吗?
最佳答案
谓词通常是一个简单的模板参数:
template <class in, class out, class UnaryPredicate>
out stransform(in b, in e, out d, UnaryPredicate p);
这将接受指向函数、lambda 和函数对象的指针。
关于c++ - 带有模板的 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7672314/