2009-09-30 67 views
-1

我對宏有疑問。我怎麼能通過宏模板類投射到普通類。例如:如何將模板類ptr轉換爲C++中的普通類ptr

#define RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class##class_name)) 

template<typename T> A {}; 

if (RUNTIME_CLASS(A)); 

我知道這段代碼不會編譯,因爲它不會看到模板位。但我不明白實際的宏。它的返回看起來像(CRuntimeClass*)(&classA)

爲什麼## concatenate使class + A?以及預處理器如何理解這種符號?

+2

##是預處理器的一個有用的功能。它允許通過串聯創建令牌。 – 2009-09-30 10:46:30

+2

我不明白你想要做什麼。 這個班級是否是模板有什麼不同? 它也看起來像你想要*類型*(A)並將其轉換爲指針。你不能。類型不是值。你是否想將'A *'類型的*對象*轉換爲'CRuntimeClass *'?你怎麼知道把它轉換成'CRuntimeClass *'是安全的? 請解釋你正在嘗試解決什麼問題。那麼我們可以告訴你,如果這是可能的,你應該怎麼做。 – jalf 2009-09-30 11:05:46

回答

1

也許你在哪裏使用宏,所有的類名都以「class」開頭,宏只需要名稱的第二部分,「class」後面是什麼。

0

這就是它所做的,##連接一個字符串和一個傳遞給你的#define的參數。

1

我不明白這個問題。

首先 - 我不明白你爲什麼要將模板類轉換爲普通類。將模板類轉換爲具體類的方法是提供模板參數。沒有這些參數,模板類尚未完全定義,因此無法使用。

某種程度上,模板是一個函數,它在編譯時被評估以定義一個類/函數。如果沒有這些參數,試圖將模板視爲一個類就像試圖將未評估的函數視爲一個數字。

如前所述,「##」是一個令牌串聯預處理器運算符。如果你不期待,我不明白你爲什麼寫「##」。

這是關於名稱混搭嗎?