Сотрудник недавно показал мне код, который он нашел в Интернете. По-видимому, он позволяет определить время компиляции того, имеет ли тип отношение «есть» с другим типом. Я думаю, что это совершенно потрясающе, но я должен признать, что не знаю, как это на самом деле работает. Кто-нибудь может мне это объяснить?
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;
}