[英]Binding member function to a member variable
前提:
这是一个函数:
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 .:此问题纠正并替换了前一个问题:将成员函数绑定到局部静态变量
正如Igor Tandetnik在评论中提到的:
将此指针绑定到成员变量是否安全?
当心编译器生成的副本构造函数和赋值运算符。 考虑:
A a(42); A b = a;
在这里,
b.handler
仍然引用&a
,而不是&b
。 这可能是您想要的,也可能不是。
我也认为性能优势不值得开发人员花费时间来维护成员变量。 (*)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.