将成员函数绑定到成员变量

Binding member function to a member variable

本文关键字:成员 变量 函数 绑定      更新时间:2023-10-16

前提条件:

这里有一个函数:

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"answers"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指针绑定到成员变量是否安全

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

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

PS.:此问题更正并替换上一个问题:将成员函数绑定到局部静态变量

Igor Tandetnik在评论中提到:

将此指针绑定到成员变量安全吗?

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

A a(42); A b = a;

这里,b.handler仍然指&a,而不是&b。这可能是你想要的,也可能不是你想要的。

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