gpt4 book ai didi

c++ - 通用 lambda 与标准模板函数(使用什么以及何时使用)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:24:12 25 4
gpt4 key购买 nike

通用 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; } };

这是我的理解

  1. lambda 允许使用 [&]、[=] 等进行上下文捕获,我不确定这将如何在通用 lambda 中使用/应用。这是主要区别吗?

  2. 通用 lambda 可以转换为函数指针,而模板特化可以转换为函数指针。

一个简单的现实世界示例将有助于理解使用什么以及何时使用。

[附加] 这是通用的 lambda 提案:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3559.pdf

最佳答案

与 lambda 非常相似,泛型 lambda 是通过等价于隐式定义的函数对象来定义的(其中非泛型 lambda 具有额外的能力,即通过空捕获它们可以转换为函数指针)。泛型和非泛型 lambda 之间唯一真正的区别是泛型 lambda 具有调用运算符,它是一个函数模板,而它是非泛型 lambda 的非模板。

  1. 对于通用 lambda,不存在到函数指针的转换(参见 5.1.2 [expr.prim.lambda] 第 6 段)。
  2. 由于通用 lambda 仍然是具有调用运算符的对象,因此它们可以直接用作可以使用通用函数对象的参数。函数模板不是这种情况:它们的行为更像是一个重载集,您需要先实例化它们,然后才能将它们作为函数对象传递。
  3. 虽然您无法获得指向函数模板的指针,但您可以获得指向函数模板特化的指针(正如@Columbo 在评论中指出的那样,函数模板特化是一个函数)。您无法从通用 lambda 中获取指向函数的指针。
  4. 函数模板参与重载决议,而函数对象并不真正参与:当在名称查找期间找到一个对象时,即使可能找到具有相同名称和 nice 的函数,也会选择该对象匹配重载。这意味着,这两个是等价的:

    template <typename T>
    auto identity(T value) { return value; }
    auto identity = [](auto value) { return value; }

    第二个实现劫持了名称,而前者被用作重载决议的候选者。

除了从函数内部创建的辅助对象外,我会为函数使用通用的 lambda 表达式,而不是作为自定义点(例如,如果标准库算法是这样的对象就好了)。主要的好处是可以很容易地调整函数对象,例如,使用 std::bind(),这对于函数模板来说是不正确的。

关于c++ - 通用 lambda 与标准模板函数(使用什么以及何时使用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27711584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com