Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通用lambdas与标准模板函数(使用内容和时间)_C++_Generics_C++11_Lambda_C++14 - Fatal编程技术网

C++ 通用lambdas与标准模板函数(使用内容和时间)

C++ 通用lambdas与标准模板函数(使用内容和时间),c++,generics,c++11,lambda,c++14,C++,Generics,C++11,Lambda,C++14,通用lambda是定义lambda的一种方式,其内容如下: auto identity = [](auto a){return a;} 将此与: template <typename T> T Identity(T t){return t;} 模板 T恒等式(T){return T;} 或与 template <typename T> struct Identity { T operator()(T a) { return a; } }; 模板 结构标识{T运算

通用lambda是定义lambda的一种方式,其内容如下:

auto identity = [](auto a){return a;}
将此与:

template <typename T>
T Identity(T t){return t;}
模板
T恒等式(T){return T;}
或与

template <typename T> 
struct Identity { T operator()(T a) { return a; } };
模板
结构标识{T运算符()(ta){返回a;};
这是我的理解

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

  • 通用lambda可以转换为函数指针,而模板专门化可以转换为函数指针

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


    [附加]这里是通用lambda建议:

    与lambda非常相似,通用lambda是通过与隐式定义的函数对象等价来定义的(其中非通用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; }
    
    模板
    自动标识(T值){返回值;}
    自动标识=[](自动值){返回值;}
    
    第二个实现劫持了名称,而前者用作重载解析中的候选名称


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

    通用lambda实际上更接近
    template struct identity{T operator()(ta){return a;}比您提供的模板函数选项更重要。我认为这可以归结为“什么时候在函数上使用lanbdas”,答案是@OMGtechy:不完全正确。通用lambda将释放出大量潜在的元编程机会,这些机会目前在模板上下文中是不可能的,因为它们无法捕获变量(通过值或引用)。除此之外,编译时的类型确定可以使其非常强大。我正在研究模板类本身中的一些应用程序,但问题是如何在通用lambda上集思广益。@cdhowie我不太明白为什么它们应该更接近类模板。我们在这里讨论的是C++14的多态lambda吗?C++14的多态lambda接近以下类型的对象:
    struct my_lambda0123{template auto operator()(T)const{return T;}@dyp。术语“generic”表示相同。函数模板专用化是一个函数。非捕获的generic lambda不转换为函数指针:“对于没有lambda捕获的generic lambda,闭包类型有一个公共的非虚拟非显式const转换函数模板,用于指向函数指针。”你能把你很好的答案移动/链接到吗?