Ein Mitarbeiter hat mir kürzlich einen Code gezeigt, den er online gefunden hat. Es scheint zu ermöglichen, dass die Kompilierzeit bestimmt, ob ein Typ eine "ist a" -Beziehung mit einem anderen Typ hat. Ich finde das total genial, aber ich muss zugeben, dass ich keine Ahnung habe, wie das eigentlich funktioniert. Kann mir das jemand erklären?Kompilierzeit Typbestimmung 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;
}
Sobald diese Funktion definiert ist, können Sie es wie folgt verwenden:
#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;
}
Das ist ziemlich verdammt cool Voodoo. – zneak
+1 Awesome Trick. – SLaks
Wenn Sie an diesen Dingen interessiert sind, erhalten Sie eine Kopie von Alexandrescus * "Modern C++ Design" *. –