Шаблон dcast.

Рубрика: C++, Дата: 22 April, 2013, Автор:

Рассмотрите вопрос о том, как можно реализовать операцию dynamic_cast. Определите и реализуйте шаблон dcast, который ведет себя как dynamic_cast, но использует лишь данные и функции, определенные вами. Проверьте, что вы можете добавлять в систему новые классы, не изменяя определения dcast и других ранее написанных классов.

Я здесь ничего сильно проверять не буду, потому что я вроде делал подобную задачу, но мой шаблон не так работает как dynamic_cat, мой шаблон использует два параметра. Я просто не хочу сильно задумываться как сделать с одним, да и в задачи вроде такого условия нету, хотя написать шаблон такой как dynamic_cast подразумевает под собой использование одного параметра, чтобы у них было свойство одно и тоже, но мы скажем на это то что мы поняли чтобы у них были действия одни и те же. Вообщем вот код:

//wablon dcast
#include <iostream>
using std::cout;
using std::endl;
#include <typeinfo>
using std::bad_cast;

class A
{
public:
	virtual void print(){};
};
class B : public A {};
class C : public A {};

template<class T,class U>
T* dcast(U* ptr)
{

	if(typeid(*ptr)==typeid(T))
	{
		cout <<"vce normal6no crabotalo return cculky"<<endl;
		return static_cast<T*>(ptr);
	}
	else
		return 0;
}


int main()
{
	B bb;
	B* bbb=&bb;
	A* ab=bbb;//ykazatel6 na bazovui klacc
	C* cc=new C;
	
	
	//B* k=dynamic_cast<B*>(ab); //normal6no vuzuvaetc9
	
	B* c=dcast<B,A>(ab);//tyt norm bez owibki
	cout <<endl<<endl;
	
	if(dcast<B,A>(ab)==0)
		cout <<"ne mojet preobrazovat6"<<endl;
	else
		cout <<"normal6no preobrazovalo"<<endl;
	
	ab=cc;//pricvaivaem ykazatelyu na bazovui klacc C
	B* k=dcast<B,A>(ab);//ravno 0 tak kak ne mojet but6 privedenie C ne ect6 B.
	if(dcast<B,A>(ab)==0)
		cout <<"ne mojet preobrazovat6"<<endl;
	else
		cout <<"normal6no preobrazovalo"<<endl; 
	
	return 0;
}

Ну и все. Я просто не хочу задумываться, хотя я до этого задумывался но ничо не вышло, поэтому так. Мб  и не правильно решил но что поделаешь. Как есть так есть.

[youtube]http://www.youtube.com/watch?v=dGqpq9H0zKM[/youtube]

rss