簡體   English   中英

為什么可以通過類類型獲取成員函數的地址

[英]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_sumthis參數通過std::bind綁定到&foo

當然,您需要具有名為foo Foo類型的實例,因為成員函數Foo::print_sum綁定到foo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM