#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>();
}