The below code explains the problem. Fill in same_sub_class to detect if the two pointers to virtual base class A are in fact the same concrete class.
struct A {
...
}:
struct B : public A {
...
}:
struct C : public A {
...
}
bool same_sub_class(A * a1, A * a2){
// Fill this in to return true if a1 and a2 are
// of the same concrete class
}
EDIT:
As I look at my application I need something slightly different from the above. I need to be able to group instances by their type_id.
FYI. I have a mini symbolic algerbra system so to do manipulations it is important to know the class type sometimes for sorting, and rearranging expressions.
So given a vector of pointers to instance how to group them by their type_id. I'd either need to be able to hash the type_id or generate a unique integer for every class.
If you can use RTTI,
typeid(*a1) == typeid(*a2)
I think you also need to
#include <typeinfo>
And you must have a virtual function in your classes so that the vtable exists--a destructor should do fine.
UPDATE:
I'm not sure I completely understand what your requirements are for grouping (Do you need some kind of deterministic ordering? What should happen with sub-subclasses?), but you could try using the value returned from the typeid
operator to either:
typeid(*ptr).name()
typeid(*a1).before(typeid(*a2))
as an ordering criterion. This doesn't have any determinism between runs, though. Generally when considering RTTI, it is a good idea to see if any of this can be accomplished better using well-crafted virtual functions (double dispatch, for example). I really can't say if there is a good alternative in your case though, since I don't understand the specifics.
Actually there are a fairly simple answers to this. But it involves posing the questions a bit clearer.
(A) If I want to store typeinfo objects in an unordered_set what do I need to do?
typeinfo support the == and the name() method. The name can be used to generate a hash and == for equality
(B) If I want to store typeinfo objects in an ordered_set ( std::set ) what do I need to do?
typeinfo supports the == and the before() method. With bit of wrapping of these two methods I can implement an interface for a Compare function that gives me strict weak ordering.
typeid(*a1) == typeid(*a2)
Note the dereference, it is important.
You could make your own type Identifier:
struct A{
...
protected:
enum TypeTag{B_TYPE, C_TYPE};
TypeTag typeTag;
};
And then in constructors of subclasses:
B::B()
: typeTag(TypeTag::B_TYPE)
{
...
}
C::C()
: typeTag(TypeTag::C_TYPE)
{
...
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With