绑定成员函数到成员变量

时间:2014-10-24 04:48:45

标签: 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指针绑定到成员变量是否安全?

两个版本之间是否存在功能差异?

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

PS。:这个问题纠正并取代了之前的问题: Binding member function to a local static variable

1 个答案:

答案 0 :(得分:1)

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

  
    

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

  
     

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

A a(42); A b = a;
     

此处,b.handler仍然引用&a,而不是&b。这可能是也可能不是你想要的。

我也不认为性能优势需要花费时间来维护成员变量。 (*)