【发布时间】:2011-02-07 16:38:42
【问题描述】:
一位同事最近向我展示了他在网上找到的一些代码。它似乎允许编译时确定一个类型是否与另一种类型具有“是”关系。我认为这非常棒,但我不得不承认我对它的实际工作原理一无所知。谁能给我解释一下?
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;
}
【问题讨论】:
-
这真是太酷了。
-
如果您对这些内容感兴趣,请获取 Alexandrescus “现代 C++ 设计” 的副本。
-
我认为到处都是,例如stackoverflow.com/questions/2631585/…。请注意,测试本身发生在编译时,但您在运行时(从函数返回)获得结果,您几乎无法将其用于任何有用的事情。
-
这是一个巧妙的技巧,但仅用于教育目的。我永远不会在我使用的代码中使用类似的东西,因为通常在好的设计中你不会明确比较类型。
-
^^ 我可能永远不应该说“从不”。但是,是的。
标签: c++ inheritance templates types