Gibt es eine Möglichkeit zu Zeit zu kompilieren geltend machen, wenn eine Variable eine Klasse, Struktur oder ein Grundtyp in C ++?
-
06-07-2019 - |
Frage
Ich versuche, eine Template-Klasse zu implementieren, die mir sagen könnte, wenn eine Variable eine Klasse, Struktur oder ein Grundtyp ist.
Bisher habe ich kommen mit diesem:
template< typename T >
class is_class
{
private:
template< typename X >
static char ( &i_class( void(X::*)() ) )[1];
//
template< typename X >
static char ( &i_class( X ) )[2];
public:
static bool const val = sizeof( i_class< T >(0) ) == 1;
};
und ussage:
is_class< int >::val; // false
is_class< some_class_type >::val; // true
Das Problem ist, dass jetzt muß ich eine leere Leere Funktion in jeder Klasse schreiben, die mit diesem Code verwendet werden könnten.
Kennt jemand eine Lösung für dieses Problem?
Lösung
is_class
ist ein Mitglied der Boost.Type_Traits Bibliothek. Die Implementierung ist wahrscheinlich ähnlich dem, was Sie bereits haben. Sie würden in in Verbindung mit enable_if
verwenden Sie die Funktion ggf. zu erstellen:
template <class T>
typename enable_if_c<boost::is_class<T>::value>::type
foo() { }
oder das Äquivalent:
template <class T>
typename enable_if<boost::is_class<T>>::type
foo() { }
Die Funktion foo
nur dann erzeugt wird, wenn der Typ T
der Klasse-Typ ist.
Der Rückgabewert für die Funktion, wenn es erzeugt wird, ist der zweite Parameter (weggelassen) an die enable_if
Vorlage (der Standard ist void
).
Andere Tipps
Mit boost Typ Züge .
Wenn es nur ist während der Kompilierung zu behaupten, Sie BOOST_STATIC_ASSERT
und Boost.TypeTraits zu überprüfen, ob Typen geeignet sind. Wenn Sie eine Vorlage für bestimmte Arten aktivieren möchten, müssen Sie unter Umständen Erfolg Boost enable_if .