簡體   English   中英

指向派生成員的指向成員的指針

[英]Pointer-to-member that points to derived member

是否有一種語法允許引用到派生成員實例的成員指針,即成員本身而不是包含對象。

如果我執行以下操作:

struct Base1
{
    int m;
};
struct Derived : Base1
{
    int n;
};
struct Base2
{
    Base1 b;
    Derived d;
};

void foo()
{
    Base1 Base2::*ptr1 = &Base2::b ;// okay
    Base1 Base2::*ptr2 = &Base2::d; // error
}

我得到的錯誤是:

error C2440: 'initializing': cannot convert from 'Derived Base2::* ' to 'Base1 Base2::* '
note: Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

有沒有一種合理的方法可以在不需要演員的情況下做到這一點? (如果可能的話,我不希望在這里使用模板,因為實際類型需要保存在當前調用鏈之外)。

我不知道這是否違反了“無模板”政策,但可以使std::variant容納任一指針類型。

using ptm_type = std::variant<Base1 Base2::*, Derived Base2::*>;
ptm_type ptr1 = &Base2::b ;// okay
ptm_type ptr2 = &Base2::d; // okay too

由於我假設您想相同地對待Base1Derived對象(為什么要麻煩),因此可以將代碼包裝在對std::visit的調用中以進行統一訪問

std::visit([](auto& p1){
  // Do your thing
}, ptr1);

盡管誠然這只是變相的另一個模板。

我認為您的問題不是您訪問派生成員對象。 這是因為您聲明了錯誤的類型。 您的第二個指針應聲明如下:

派生的Base2 :: * ptr2 =&Base2 :: d; // 好

您是否正在專門嘗試將基指針應用於派生類的語義,以供指針成員使用? 那是行不通的,它必須與確切的類型匹配。 您甚至無法執行任何瑣碎的轉換,例如,聲明一個指向void的指針,該指針指向一個int成員的指針。

如果願意,可以在將指向成員的指針綁定到其實例之后,通過使用新的賦值來通過公共基類指針執行任何公共訪問。

暫無
暫無

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

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