Un collaboratore mi ha recentemente mostrato un codice che ha trovato online. Sembra consentire la determinazione del tempo di compilazione per stabilire se un tipo ha una relazione "è una" con un altro tipo. Penso che sia assolutamente fantastico, ma devo ammettere che non ho idea di come funzioni effettivamente. Qualcuno può spiegarmi questo?Determinazione del tipo di tempo di compilazione in 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 volta che questa funzione è definita, è possibile utilizzarlo in questo modo:
#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;
}
Questo è dannatamente fresco voodoo. – zneak
+1 Impressionante trucco. – SLaks
Se sei interessato a queste cose, procurati una copia di Alexandrescus * "Modern C++ Design" *. –