一位同事最近向我展示了他在网上找到的一些代码。它似乎允许编译时确定一个类型是否与另一个类型有“是”关系。我认为这是完全可怕的,但我不得不承认,我对这种实际工作方式毫无头绪。任何人都可以向我解释这个吗?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