#include <map> class A { public: virtual ~A(); template <typename T> T * down() { return reinterpret_cast<T*>(this); } }; template <int K> class B : public A { public: static const int TYPE = K; }; class C : public B<3> { }; class R { public: template <typename T> T * get() { auto i = _r.find(T::TYPE); if (i != _r.end()) { return i->second->down<T>(); } return 0; } std::map<int, A*> _r; }; int main () { R r; r.get<C>(); }