与Lambda绑定?

我有一个关于首选样式的问题:std :: bind与C ++ 0x中的lambda。我知道它们的用途有所不同,但让我们以交叉功能为例。


使用lambda:


uniform_int<> distribution(1, 6);

mt19937 engine;

// lambda style

auto dice = [&]() { return distribution(engine); };

使用bind:


uniform_int<> distribution(1, 6);

mt19937 engine;

// bind style

auto dice = bind(distribution, engine);

我们应该选择哪一个?为什么?与上述示例相比,假设情况更为复杂。即,一个相对于另一个的优点/缺点是什么?


慕后森
浏览 391回答 3
3回答

侃侃尔雅

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{&nbsp; typedef void result_type;&nbsp; template < typename A, typename B >&nbsp; void operator()(A a, B b)&nbsp; {&nbsp; &nbsp; cout << a << ' ' << b;&nbsp; }};auto f = bind(foo(), _1, _2);f("test", 1.2f); // will print "test 1.2"请注意,此处未固定类型A和B。仅当实际使用f时,才能推论这两个。

一只萌萌小番薯

Lambda的优点之一是,当您需要在现有函数之上添加一些大逻辑时,它们会更加有用。使用bind,即使仅在该位置需要逻辑,您也必须创建一个新的函数/方法/函数。您需要提供一个适当的名称,它可能会使代码难以理解,因为它可能会使您分解相关的逻辑。使用lambda,您可以在lambda内添加新逻辑(但如果创建新的可调用对象有意义,则不必强制这样做)。
打开App,查看更多内容
随时随地看视频慕课网APP