我有一个关于首选样式的问题: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条经验 获得超16个赞
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时,才能推论这两个。
一只萌萌小番薯
TA贡献1795条经验 获得超7个赞
Lambda的优点之一是,当您需要在现有函数之上添加一些大逻辑时,它们会更加有用。
使用bind,即使仅在该位置需要逻辑,您也必须创建一个新的函数/方法/函数。您需要提供一个适当的名称,它可能会使代码难以理解,因为它可能会使您分解相关的逻辑。
使用lambda,您可以在lambda内添加新逻辑(但如果创建新的可调用对象有意义,则不必强制这样做)。
- 3 回答
- 0 关注
- 412 浏览
添加回答
举报
0/150
提交
取消