[英]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
由於我假設您想相同地對待Base1
和Derived
對象(為什么要麻煩),因此可以將代碼包裝在對std::visit
的調用中以進行統一訪問
std::visit([](auto& p1){
// Do your thing
}, ptr1);
盡管誠然這只是變相的另一個模板。
我認為您的問題不是您訪問派生成員對象。 這是因為您聲明了錯誤的類型。 您的第二個指針應聲明如下:
派生的Base2 :: * ptr2 =&Base2 :: d; // 好
您是否正在專門嘗試將基指針應用於派生類的語義,以供指針成員使用? 那是行不通的,它必須與確切的類型匹配。 您甚至無法執行任何瑣碎的轉換,例如,聲明一個指向void的指針,該指針指向一個int成員的指針。
如果願意,可以在將指向成員的指針綁定到其實例之后,通過使用新的賦值來通過公共基類指針執行任何公共訪問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.