为了账号安全,请及时绑定邮箱和手机立即绑定

与Lambda绑定?

与Lambda绑定?

C++
慕后森 2019-11-13 14:51:26
我有一个关于首选样式的问题:std :: bind与C ++ 0x中的lambda。我知道它们的用途有所不同,但让我们以交叉功能为例。使用lambda:uniform_int<> distribution(1, 6);mt19937 engine;// lambda styleauto dice = [&]() { return distribution(engine); };使用bind:uniform_int<> distribution(1, 6);mt19937 engine;// bind styleauto dice = bind(distribution, engine);我们应该选择哪一个?为什么?与上述示例相比,假设情况更为复杂。即,一个相对于另一个的优点/缺点是什么?
查看完整描述

3 回答

?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

C ++ 0x lambda是单态的,而bind可以是多态的。你不能有这样的东西


auto f = [](auto a, auto b) { cout << a << ' ' << b; }

f("test", 1.2f);

a和b必须具有已知的类型。另一方面,tr1 / boost / phoenix / lambda bind允许您执行以下操作:


struct foo

{

  typedef void result_type;


  template < typename A, typename B >

  void operator()(A a, B b)

  {

    cout << a << ' ' << b;

  }

};


auto f = bind(foo(), _1, _2);

f("test", 1.2f); // will print "test 1.2"

请注意,此处未固定类型A和B。仅当实际使用f时,才能推论这两个。


查看完整回答
反对 回复 2019-11-13
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

Lambda的优点之一是,当您需要在现有函数之上添加一些大逻辑时,它们会更加有用。


使用bind,即使仅在该位置需要逻辑,您也必须创建一个新的函数/方法/函数。您需要提供一个适当的名称,它可能会使代码难以理解,因为它可能会使您分解相关的逻辑。


使用lambda,您可以在lambda内添加新逻辑(但如果创建新的可调用对象有意义,则不必强制这样做)。


查看完整回答
反对 回复 2019-11-13
  • 3 回答
  • 0 关注
  • 389 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信