1. #include <map>
  2.  
  3. class A
  4. {
  5. public:
  6. virtual ~A();
  7. template <typename T> T * down()
  8. {
  9. return reinterpret_cast<T*>(this);
  10. }
  11.  
  12. };
  13.  
  14. template <int K>
  15. class B : public A
  16. {
  17. public:
  18. static const int TYPE = K;
  19. };
  20.  
  21. class C : public B<3>
  22. {
  23.  
  24. };
  25.  
  26.  
  27. class R
  28. {
  29. public:
  30.  
  31. template <typename T> T * get()
  32. {
  33. auto i = _r.find(T::TYPE);
  34. if (i != _r.end())
  35. {
  36. return i->second->down<T>();
  37. }
  38. return 0;
  39. }
  40. std::map<int, A*> _r;
  41. };
  42.  
  43.  
  44. int main ()
  45. {
  46. R r;
  47. r.get<C>();
  48. }
  49.  
  50.