我們有一個子項目'commonUtils',它有許多在父項目中使用的通用代碼片段。 一個這樣有趣的東西我看到的是: -測試一個類是否是多態的
/*********************************************************************
If T is polymorphic, the compiler is required to evaluate the typeid
stuff at runtime, and answer will be true. If T is non-polymorphic,
the compiler is required to evaluate the typeid stuff at compile time,
whence answer will remain false
*********************************************************************/
template <class T>
bool isPolymorphic() {
bool answer=false;
typeid(answer=true,T());
return answer;
}
我相信評論,認爲這是一個相當有趣的模板,雖然它不是在整個項目中使用 。我試圖用它只是爲了好奇...
class PolyBase {
public:
virtual ~PBase(){}
};
class NPloyBase {
public:
~NBase(){}
};
if (isPolymorphic<PolyBase>())
std::cout<<"PBase = Polymorphic\n";
if (isPolymorphic<NPolyBase>())
std::cout<<"NBase = Also Polymorphic\n";
但是,這些都沒有返回true。 MSVC 2005沒有提供警告,但Comeau警告typeid表達式沒有效果。 C++標準中的第5.2.8節並沒有說出什麼像評論說的那樣,即typeid是在編譯時爲非多態類型和在運行時爲多態類型評估的。
1)所以我想這個評論是誤導性的/錯誤的,或者因爲這段代碼的作者是相當高級的C++程序員,我錯過了什麼嗎?
2)OTOH,我想知道是否可以使用某種技術測試一個類是否是多態的(至少有一個虛函數)?
3)何時想知道某個類是否爲多態?胡亂猜測;通過使用dynamic_cast<void*>(T)
來獲得類的起始地址(因爲dynamic_cast
僅適用於多態類)。
等待您的意見。
由於提前,
呃,如果作者是高級C++程序員,爲什麼不先和他覈對一下? ...你會經常從有經驗的人那裏學到很多東西。 – stefanB 2009-07-10 06:13:42
那麼,如果我可以我不會問它在stackoverflow :-) – Abhay 2009-07-10 06:16:46