Gibt es eine Möglichkeit zu Zeit zu kompilieren geltend machen, wenn eine Variable eine Klasse, Struktur oder ein Grundtyp in C ++?

StackOverflow https://stackoverflow.com/questions/828442

  •  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?

War es hilfreich?

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 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top