Ответы пользователя по тегу Программирование
  • RTTI vs Шаблонная магия?

    @NYM
    Берем идею, упомянутую ссылкой в постах выше и делаем для нее пример:
    #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 тоже не бесплатно работает, он требует плату виртуальностью, т.е. ваш класс должен хоть что-то содержать виртуальное, хоть деструктор, но тип должен быть полиморфным.
    Ответ написан