die Identifizierung der Art

In meiner Anwendung gibt es eine Hierarchie, in denen nur die Klassen, die am Ende der Vererbungskette sind nicht abstrakte Klassen. Auch gibt es einige Verwendung von boost::variant. Ich möchte eine Funktion schreiben, die einen Zeiger und einen Typ und sagt aus, ob das Objekt gehört zu diesem Typ.

Beispielsweise

#define IsA(nodeptr, type)   ( checkType<type>(nodeptr) ) 

template<typename Type, bool isAbstract, typename PtrType >
class CheckType
{
    bool operator()( PtrType* ptr ) { return ( typeid(*ptr) == typeid(Type) ); }
};

template<typename Type, typename PtrType >
class CheckType < Type, true, PtrType >
{
    bool operator()( PtrType* ptr ) { return ( dynamic_cast<Type*>(ptr) != NULL ); }
};

template<typename Type, BOOST_VARIANT_ENUM_PARAMS(typename T) >
class CheckType< Type, false, boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
{
    bool operator()( boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>* ptr ) 
    { 
        return ( ptr->type() == typeid(Type) ); 
    }
}

template< typename Type, typename PtrType >
bool checkType( PtrType* nodePtr )
{
    CheckType<Type, boost::is_abstract<PtrType>::value, PtrType> check;
    return check(nodePtr);
}

Nun, wenn es eine boost-Variante, ich möchte herausfinden, ob die boost-Variante speichert diesen bestimmten Typ. Kann mir jemand helfen mit, dass? Ich will nicht, um einen zusätzlichen parameter, um herauszufinden, ob es ist die eine Variante. Auch für die Suche nach dem Abstraktheit, ich bin mit boost::is_abstract..

Dank,
Gokul.

  • funktioniert dynamic_cast nicht füllen die Rechnung für Sie?
  • Wir wollen typeid Ort der dynamic cast, wo immer möglich. Boost::Variant funktioniert nicht mit dynamischen cast
InformationsquelleAutor Gokul | 2010-04-21
Schreibe einen Kommentar