Bind 与 Lambda:探索它们的差异和适用性
在 C 0x 中,开发人员可以选择使用 lambda 表达式或 std: :bind 来完成某些编程任务。虽然这两种技术有一些共同点,但它们在特定场景中的适用性可能会有很大差异。
交叉功能示例
让我们考虑 lambda 和 bind 之间交叉功能的示例。假设我们需要使用引擎生成随机数。使用 lambda,我们可以封装必要的逻辑如下:
<code class="cpp">uniform_int<> distribution(1, 6); mt19937 engine; // lambda style auto dice = [&]() { return distribution(engine); };</code>
或者,使用 std::bind,我们可以获得相同的结果:
<code class="cpp">uniform_int<> distribution(1, 6); mt19937 engine; // bind style auto dice = bind(distribution, engine);</code>
单态与多态性
lambda 表达式和 std::bind 之间的关键区别在于它们的多态性功能。 C 0x 中的 Lambda 表达式是单态的,这意味着它们的参数必须具有已知类型。使用接受不同类型参数的泛型函数时可能会遇到此限制。
例如,考虑以下 lambda:
<code class="cpp">auto f = [](auto a, auto b) { cout << a << ' ' << b; }
使用此 lambda 需要指定 a 和 的类型b 在编译时。在事先不知道类型的情况下,这可能是一个限制。
相反,std::bind 允许多态行为。利用 Phoenix/lambda 绑定,开发人员可以定义接受不同类型参数的函数,如下例所示:
<code class="cpp">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);</code>
在这种情况下,参数 a 和 b 的类型是在运行时推导的,提供更大的灵活性。
优点和缺点
总结每种方法的优点和缺点:
Lambda 表达式:
std::bind:
结论
C 0x 中 std::bind 和 lambda 表达式的选择取决于应用程序的具体要求。对于单态场景,lambda 提供了一种方便而简洁的方法。对于参数类型可以动态变化的多态场景,std::bind 提供了更大的灵活性。了解这两种技术的优点和缺点可以让开发人员在编写代码时做出明智的决定。
以上是Lambda 与 `std::bind`:什么时候应该在 C 中使用它们?的详细内容。更多信息请关注PHP中文网其他相关文章!