c++ - 带有模板的 lambda

标签 c++ templates lambda 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;
}

与普通转换一样,我必须使用显式类型调用谓词

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/

相关文章:

c++ - 在编译时检查未实例化的类模板是否继承自其第一个模板参数

c++ - 选择模板参数不同的模板类构造器导致编译失败

c++ - std::function 的开销

c++ - 比较指向的两个整数值

从数组维度推导 C++ 模板参数

c++ - QtConcurrent::run with lambda on mac os 没有匹配函数

templates - 关于 postblit 和 move 语义的问题

jsonpath 库的 java 8 lambda 技术问题

Java 8 基于嵌套对象属性的 pojo 过滤列表

python - 对 lambda 和列表理解感到困惑