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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nun, es gibt zwei direkt-Versionen dieser:
Und so:
Ich bin nicht sicher, wie Sie Sie zu behandeln, die mit Ihrer Vorlage überladen sauber, aber Sie könnten so etwas tun:
Der sauberste Weg, um mit
Boost.Variant
ist normalerweise die Verwendung eines Besuchers.Dann können Sie wickeln Sie es:
Die verwendet werden können, etwa so:
Dies ist jedoch nicht der OO-Weg, und weder ist es die Variante Weg.
Eine bessere Idee wäre, um die volle Leistung von
Boost.Variant
:Beachten Sie, wie die
static_visitor
Konzept natürlich behandelt der Vererbung.operator()
implementiert, in der Besucher ein template ein, dann funktioniert es mit jeder Variante 🙂