Un compañero de trabajo me mostró recientemente un código que encontró en línea. Parece permitir la determinación del tiempo de compilación de si un tipo tiene una relación "es una" con otro tipo. Creo que esto es totalmente increíble, pero tengo que admitir que no tengo ni idea de cómo funciona esto en realidad. ¿Puede alguien explicarme esto?Determinación del tipo de tiempo de compilación en 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;
}
Una vez definida esta función, se puede utilizar de esta manera:
#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;
}
Eso es vudú bastante maldito. – zneak
+1 truco impresionante. – SLaks
Si está interesado en esas cosas, obtenga una copia de Alexandrescus * "Modern C++ Design" *. –