2014-04-23 41 views
-1

是否可以創建一個C++宏 - 如果在類的方法中調用 - 接受void*值並將其轉換爲當前類類型?在C++編譯期間檢索當前類的類型

class Foo{ 
    void bar(); 
    void baz(){ void* pInst = some_magic_source(); SOME_MACRO(pInst)->bar(); } 
}; 

該解決方案應該與VC++ 2012+和GCC 4.8+兼容。

(我需要這是一個更復雜的宏的一部分)

+1

爲此使用繼承並讓'some_magic_source'返回一個指向公共基類的指針。停止使用'void *'並停止使用宏。 – rubenvb

+0

@rubenvb'some_magic_source()'是C兼容庫的一部分,因此不能返回任何類類型。我真的需要使用'void *'values – muffel

+0

,所以你告訴我你正在使用C++庫的C接口(因爲你正在調用鑄造對象的成員函數)?你不能只使用C++庫嗎? – rubenvb

回答

3

的指針當前類類型的this類型,導致了以下簡單的宏:

#define SOME_MACRO(x) (static_cast<decltype(this)>(x)) 

注意當前類的類型可能是cv限定的(因此,this指針可能指向cv限定類型,這意味着該轉換可能會導致指向cv限定對象的指針)。如果需要,您可以輕鬆使用類型特徵如remove_cv來處理此問題。

+0

這絕對沒有理由成爲一個宏。 – rubenvb

+0

我認爲OP期望更復雜的解決方案;) –

+0

@rubenvb實際上是。我發現在編譯時沒有__CLASS__宏放入當前類是非常可悲的。例如,對於使用類成員函數指針的宏,這是絕對需要的。現在,你總是必須將該類傳遞給宏,而不是讓宏自己獲得它。 –