通用 lambda 与标准模板函数(使用什么以及何时使用)
Generic lambdas Vs Standard template functions (What to use and When)
通用 Lambda 是一种定义 lambda 的方法,如下所示:
auto identity = [](auto a){return a;}
将此与以下内容进行比较:
template <typename T>
T Identity(T t){return t;}
或与
template <typename T>
struct Identity { T operator()(T a) { return a; } };
这是我的理解
lambda 允许使用 [&]、[=] 等进行上下文捕获,我不确定这将如何在通用 lambda 中使用/应用。这是主要区别吗?
通用 lambda 可以强制转换为函数指针,而模板专用化可以强制转换为函数指针。
一个简单的真实示例将有助于了解使用什么以及何时使用。
[附] 这是通用的 lambda 提案: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3559.pdf
与lambdas非常相似,泛型lambdas是通过等效于隐式定义的函数对象来定义的(其中非泛型lambda具有额外的能力,即通过空捕获它们可以转换为函数指针)。泛型和非泛型 lambda 之间唯一真正的区别是泛型 lambda 具有调用运算符,它是一个函数模板,而它是非泛型 lambda 的非模板。
- 对于通用 lambda,不存在
- 到函数指针的转换(参见 5.1.2 [expr.prim.lambda] 第 6 段)。
- 由于泛型 lambda 仍然是具有调用运算符的对象,因此可以直接用作可以使用泛型函数对象的参数。函数模板的情况并非如此:它们的行为更像是一个重载集,您需要先实例化它们,然后才能将它们作为函数对象传递。 虽然无法获取指向函数模板的指针
- ,但可以获取指向函数模板专用化的指针(如注释中@Columbo指出的那样,函数模板专用化是一个函数)。您无法从通用 lambda 中获取指向函数的指针。 函数模板参与重载解析,而函数对象
并不真正参与:在名称查找期间找到对象时,即使可以找到具有相同名称且与重载匹配良好的函数,也会选择此对象。这意味着,这两者并不等同:
template <typename T> auto identity(T value) { return value; } auto identity = [](auto value) { return value; }
第二个实现劫持名称,而前者用作重载解析中的候选者。
除了从函数内部创建的辅助对象之外,我会对不打算作为自定义点的函数使用通用 lambda(例如,如果标准库算法是这样的对象会很好)。主要好处是函数对象可以很容易地适应,例如,使用std::bind()
而函数模板则不然。
相关文章:
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 让编译器告诉什么确切的纯虚拟方法使结构抽象?
- 何时使函数成为类成员函数C++?
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 是什么使这个以'+'开头的字符串添加成为有效的语句?
- 使用信号检测子进程何时终止的最佳方法是什么?
- 我需要做什么才能使ZMQ_RADIO/ZMQ_DISH正常工作?
- 何时必须使操作员<<过载?
- 使变量成为常数的重要性是什么?
- 使与同一数组无关的两个指针减去未定义行为的基本原理是什么?
- 什么是使类不可移动的用例(如果有的话)
- 你应该在什么时候使一个类不可压缩
- 我做的平均过滤器是否正确?我需要更改什么才能使其正常工作
- 在C++中,我应该在什么时候使一个方法为常数
- 我需要做些什么才能使odeint集成函数在另一个类中编译
- 什么是使应用程序具有CPU和GPU计算后端的最佳方法
- ' std::sort '在内部使用了什么魔法使它更快?
- 什么容器使用时,我需要知道两者的最大值和谁已经实现了它
- 什么可以使纳米睡眠漂移在 mac OS X 10.9 上正好 10.9 秒
- 什么可以使不更改地址的 Win32 C++指针突然指向无效内存?