![](/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.