Берем идею, упомянутую ссылкой в постах выше и делаем для нее пример:
#include <iostream>
class TypeIdGenerator
{
public:
template <typename T>
static const int GetId()
{
static const int Id = GetNextId();
return Id;
}
private:
static int GetNextId()
{
static int Id = 0;
return Id++;
}
};
struct ICast
{
virtual ~ICast()
{
}
virtual void const* Cast(int id) const = 0;
virtual void * Cast(int id) = 0;
};
template <typename T>
class CastImpl
: public T
{
public:
virtual void const* Cast(int id) const
{
return id == TypeIdGenerator::GetId<T>() ? this : 0;
}
virtual void * Cast(int id)
{
return id == TypeIdGenerator::GetId<T>() ? this : 0;
}
};
template <typename T>
T* MyCast(ICast *obj)
{
return reinterpret_cast<T *>(obj->Cast(TypeIdGenerator::GetId<T>()));
}
template <typename T>
T const* MyCast(ICast const *obj)
{
return reinterpret_cast<T const *>(obj->Cast(TypeIdGenerator::GetId<T>()));
}
class A
: public ICast
{
public:
void mtd() const
{
std::cout << __FUNCTION__ << std::endl;
}
};
int main()
{
ICast const &obj = CastImpl<A>();
A const *a = MyCast<A>(&obj);
if (a)
a->mtd();
return 0;
}
Для работы такого каста нужно наследование от некого интерфейса, но не будем забывать, что dynamic_cast тоже не бесплатно работает, он требует плату виртуальностью, т.е. ваш класс должен хоть что-то содержать виртуальное, хоть деструктор, но тип должен быть полиморфным.