Re: Elaborate visitor pattern <-> templates
* Rune Allnor:
I have a hierarchy of classes that look something like
%%%%%%%%%%%%%%%%%%%%%%%%
class base{};
class subtypeA : public base {};
class subtypeB : public base{};
class subsubtypeA1 : public subtypeA {};
class subsubtypeA2 : public subtypeA {};
class subsubtypeB1 : public subtypeB {};
class subsubtypeB2 : public subtypeB {};
%%%%%%%%%%%%%%%%%%%%%%%%
I intend to use a std::map and a set of labels + factories
to generate an instance of specified type, based on user
input. In order to test this factory, I want to query the
returned object for its type.
You can use 'typeid' to check whether an object is of a specific dynamic type,
and 'dynamic_cast' to check whether an object's type T is some given type U or
derived from U.
For 'typeid' you need to supply an lvalue whose statically known type is a
polymorphic class type, in order to get at the dynamic (runtime) type. You can
use the 'name' member function of the resulting type-info object to obtain a
compiler-dependent type description. Thus (disclaimer: off-the cuff code):
#include <typeinfo>
...
cout << typeid(*p).name() << endl;
cout << (typeid(*p)==typeid(A)? "It's an A (exact)" : "Not exact A") << endl;
cout << (dynamic_cast<A*>(p) != 0? "It's an A" : "Not A") << endl;
With the Visual C++ compiler, at least older versions, you have to turn on RTTI
(Run Time Type Information) support to use these features, option '/GR'.
Cheers & hth.,
- Alf
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]