一位同事最近向我展示了他在網上找到的一些代碼。它似乎允許編譯時確定一個類型是否與另一個類型有「是」關係。我認爲這是完全可怕的,但我不得不承認,我對這種實際工作方式毫無頭緒。任何人都可以向我解釋這個嗎?C++編譯時間類型確定
template<typename BaseT, typename DerivedT>
inline bool isRelated(const DerivedT&)
{
DerivedT derived();
char test(const BaseT&); // sizeof(test()) == sizeof(char)
char (&test(...))[2]; // sizeof(test()) == sizeof(char[2])
struct conversion
{
enum { exists = (sizeof(test(derived())) == sizeof(char)) };
};
return conversion::exists;
}
一旦這個函數的定義,你可以使用它像這樣:
#include <iostream>
class base {};
class derived : public base {};
class unrelated {};
int main()
{
base b;
derived d;
unrelated u;
if(isRelated<base>(b))
std::cout << "b is related to base" << std::endl;
if(isRelated<base>(d))
std::cout << "d is related to base" << std::endl;
if(!isRelated<base>(u))
std::cout << "u is not related to base" << std::endl;
}
這是相當該死的酷伏都教。 – zneak 2010-04-13 23:06:04
+1令人敬畏的技巧。 – SLaks 2010-04-13 23:11:38
如果您對這些東西感興趣,請獲取Alexandrescus *「Modern C++ Design」*的副本。 – 2010-04-13 23:12:10