【问题标题】:Why should bind() be deprecated?为什么不推荐使用 bind()?
【发布时间】:2016-02-23 11:40:10
【问题描述】:

阅读 C++17 关于删除标准中一些已弃用、旧和未使用部分的提案 (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4190.htm) 我发现第 D.9 节有点奇怪:

D.9 “活页夹” [depr.lib.binders]

这定义了 bind1st()/bind2nd(),它们被 bind() 严格取代。 (将来,我会争辩说 bind() 本身已被 lambdas 取代 尤其是通用的 lambda,所以 bind() 应该被弃用,但是 不在此提案中。)

我没有得到关于 bind() 本身被 lambdas 取代的评论。

如果我有课:

class A
{
  public:
    void f(int a){}
    void f(int a, int b){}
}

我想将指向A::f 的函数指针传递给某个函数someFunction,以便该函数可以在从A 实例化的对象上调用它,我声明someFunction

void someFunction(const std::function<void(int, int)>&);

并称它为:

A a;
someFunction(std::bind(static_cast<void (A::*)(int, int)> (&A::f),
                       std::ref(a), 
                       std::placeholders::_1,
                       std::placeholders::_2));

如何使用 lambda 实现相同的目标? bind() 真的没有什么是 lambda 做不到的吗?

【问题讨论】:

  • C++14 具有通用 lambdas (auto f = [](auto x) { ... })。我仍然喜欢bind,我认为它不应该被弃用。
  • 本文Appendix: Why we need bind when we have a generic lambda? 中的部分使bind 的案例仍然有用,但它似乎不是一个强有力的案例。
  • @ShafikYaghmour 摘要中的例子对我来说是一个非常有力的案例:)
  • 这绝对是一个视角问题 :-) 我想我的意思是没有任何参数可以证明绑定可以做到而 lambda 无法做到。我们当然可以在可用性上存在分歧。

标签: c++ lambda std-function stdbind


【解决方案1】:

你是怎么做到的?与std::refplaceholders_ 的绑定示例相比,非常直接且不那么深奥(我的意见)。

#include <iostream>
#include <functional>

class A
{
public:
   void f(int a) {}
   void f(int a, int b) { std::cout << a + b << '\n';}
};

void someFunction(const std::function<void(int, int)>& f)
{
   f(1, 2);
}

int main()
{
   A a;
   someFunction([&] (int x, int y) { a.f(x, y); });
   return 0;
}

【讨论】:

    猜你喜欢
    • 2017-11-04
    • 2011-10-22
    • 2011-04-11
    • 2021-10-12
    • 2012-12-07
    • 2012-05-16
    • 2020-06-29
    • 2014-08-11
    • 2016-06-19
    相关资源
    最近更新 更多