c++ - 绑定(bind)成员函数到成员变量

标签 c++ bind

前提条件:

这是一个函数:

typedef std::function<void (int)> Handler;
void g(const Handler& h) {
  h(100);
}

,和一个类(原始版本):

class A {
 public:
  A(int arg)
    : m(arg) {}

  void f0(int n) {
    std::cout << m + n << std::endl;
  }

  void f() {
    ::g(std::bind(&A::f0, this, std::placeholders::_1));
  }

 private:
  const int m;
};

这将打印两行,“101”和“102”:

int main() {
  A a1(1);
  a1.f();

  A a2(2);
  a2.f();

  return 0;
}

现在我意识到 A::f() 会被非常频繁地调用,
所以我像这样修改它(新版本):

class A {
 public:
  A(int arg)
    : m(arg),
      handler(std::bind(&A::f0, this, std::placeholders::_1)) {}

  void f0(int n) {
    std::cout << m + n << std::endl;
  }

  void f() {
    ::g(handler);
  }

 private:
  const int m;
  const Handler handler;
};

我的问题:

this指针绑定(bind)到一个成员变量是否安全?

两个版本在功能上没有区别吗?

我可以期待新版本真的会获得一些性能优势吗?
(我怀疑我的编译器(MSVC)会自己优化它,
所以我可能不需要自己优化它)。

PS.: 本题更正并替换上一题: Binding member function to a local static variable

最佳答案

正如 Igor Tandetnik 在评论中提到的:

Is it safe to bind this pointer to a member variable?

当心编译器生成的复制构造函数和赋值运算符。考虑:

A a(42); A b = a;

这里的b.handler还是指&a,不是&b。这可能是也可能不是您想要的。

我也不认为性能优势值得开发时间维护成员变量。 (*)

关于c++ - 绑定(bind)成员函数到成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26541667/

相关文章:

c++ - 如何使用 boost 进行成员(member)访问复制

javascript - 使用绑定(bind)原型(prototype)更改 'this' 的范围

MVVM 解决方案架构

jQuery解绑大量事件

c++ - 使用 gnuPlot 在 C++ 中绘制图形

c++ - 可变参数模板与使用元组在参数中添加不同的数据对

c++ - 分配字符串指针字符串值时出现问题

c++ - STL 中的双端队列到底是什么?

jquery:在第二个插件发生更改后触发一个插件的公共(public)方法

c++ - 在 std::function 上递归应用 std::bind 的问题