比方說,我有這幾種:如何做一個靜態聲明指針轉換是微不足道的?
struct A {
int a;
};
struct B {
int b;
};
struct C : public A, public B {
int c;
};
一個C*
指針可以轉換爲A*
指針,而完全不調整的實際地址。但是,C*
投射到B*
時,值必須更改。我希望確保兩個相關的類型可以在不改變地址的情況下相互轉換(即沒有多重繼承,或者基類是派生類的第一個基類)。這可以在運行時檢查,例如,像這樣
assert(size_t(static_cast<A*>((C*)0xF000) == 0xF000);
assert(size_t(static_cast<B*>((C*)0xF000) != 0xF000);
這是行得通的。但是這些信息在編譯時是已知的,所以我正在尋找一種編譯時斷言的方法。轉換上述靜態斷言(例如替換assert
與BOOST_STATIC_ASSERT
給錯誤「的鑄造到不是整型或枚舉類型之外的類型不能出現在恆定表達」使用g ++ 4.2。
可移植性的明顯的方式是不是太重要使用gcc的擴展,或者哈克模板招數都將是罰款
更新:。發現,幾乎同樣的問題以前有人問:C++, statically detect base classes with differing addresses?使用offsetof()
是那裏唯一有用的建議了。
不想成爲一個挑剔的人,但因爲確切的內存佈局是一個實現細節......你爲什麼會對這個完全感興趣? – 2011-04-04 06:23:57
我很確定Boost/lambda庫包含這個東西。我不得不去查看它,但Alexandrescu和Vandervoorde已經發布了這個領域的所有技巧 – sehe 2011-04-04 06:39:03
我真的對@Matthieu M.提出的問題感興趣:如果演員陣容可以變得微不足道,那麼在什麼情況下呢? (即如果它不平凡,成本可能可以忽略不計:給派生指針增加一個常量,如果條件沒有正確完成,你會遇到真正的痛苦,試圖調試看起來像損壞的內存) – 2011-04-04 07:47:44