Dans mon application, il existe une hiérarchie d'héritage dans laquelle seules les classes situées à la fin de la chaîne d'héritage sont des classes non abstraites. Il y a aussi une utilisation de boost :: variant. Je veux écrire une fonction qui prend un pointeur et un type et indique si l'objet appartient à ce type.identification du type
Par exemple
#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);
}
Maintenant, s'il y a une variante de boost, je veux savoir si les magasins de variantes de stimuler ce type particulier. Quelqu'un peut-il m'aider avec ça? Je ne veux pas ajouter un paramètre supplémentaire pour savoir s'il s'agit d'une variante. Même pour trouver l'abstrait, j'utilise boost :: is_abstract ..
Merci, Gokul.
Est-ce que dynamic_cast ne remplit pas la note pour vous? –
Nous voulons utiliser typeid à la place de la distribution dynamique autant que possible. Boost :: Variant ne fonctionne pas avec la distribution dynamique – Gokul