![](/img/trans.png)
[英]How can I use decltype to get the address of some class type's member function?
[英]why can get address of member function by class type
我遇到了以下代码:
auto f3 = std::bind(&Foo::print_sum, &foo, 95, _1);
在前面的代码中,我们可以在没有创建实例对象的情况下将address运算符应用于成员函数,那怎么可能呢?
C ++的类型系统包含一个鲜为人知的类型类别,它们是指向member的指针 。 给定任何类类型C
和任何对象或函数类型T
,就存在一个指向成员的指针类型TC::*
。 这些类型的值可以通过将address-of运算符应用于类成员的合格名称来获得。 例如:
struct Foo;
int Foo::* pi; // C = Foo, T = int
void (Foo::* pf)(bool, int); // C = Foo, T = void(bool, int)
struct Foo {
int a;
int b;
void f(bool, int);
void g(bool, int);
};
pi = &Foo::a;
pf = &Foo::f;
成员指针本身仅抽象选择一个类成员,与任何类实例无关。 要实际使用指针,您需要一个类实例和member-dereference运算符.*
:
Foo x;
int n = x.*pi; // gets x.a
(x.*pf)(true, n); // calls x.f(true, n)
pf = &Foo::g;
(x.*pf)(true, n); // calls x.g(true, n)
(通过指向成员的指针pf
的调用表达式中的括号是必需的,因为否则表达式a.*b(c)
意味着a.*(b(c))
。这对于新用户而言有时是一个困惑点。 )
不要将指向对象成员的指针与指向实际对象的指针混淆!
int * p = &(x.*pi); // p = &x.a
这里p
指向实际的int
子对象xa
并且是一个普通的对象指针,而pi
是一个指向成员的指针,该成员抽象地选择了Foo::a
Foo
对象Foo::a
成员。
使用Foo
成员函数的地址可以为您提供一个指向成员函数的指针。 此类型完全独立于任何Foo
对象。 如果要实际调用该函数,则需要提供一个Foo
对象。 在这种情况下, Foo::print_sum
的this
参数通过std::bind
绑定到&foo
。
当然,您需要具有名为foo
Foo
类型的实例,因为成员函数Foo::print_sum
绑定到foo
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.