Шаблон ptr_cast.

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

Напишите шаблон ptr_cast, который работает как dynamic_cast, только он вместо возврата нуля генерирует исключение bad_cast.

Ну что ж господа начнем. Для начала мы должны разобраться непосредственно с самим dynamic_cast. Что это такое я не знаю. Поэтому я создам пост, который посвящу этой фигне.

Я подчитал и теперь примерно разобрался как мы его будем писать, прежде чем это делать вы должны понимать, что такое dynamic_cast() и typeid()  . Мы будем делать шаблон с использованием typeid() я так думаю как то его попробовать применить.

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

//wablon ptr_cast
#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* ptr_cast(U* ptr)
{

	//cout <<"mu v tyt"<<endl;
	try
	{
		if(typeid(*ptr)==typeid(T))
		{
			cout <<"vce normal6no crabotalo return cculky"<<endl;
			return static_cast<T*>(ptr);
		}
		else
			throw bad_cast();
	}
	catch(bad_cast& e)
	{
		cout <<e.what()<<endl;
	}
}

int main()
{
	B bb;
	B* bbb=&bb;
	A* ab=bbb;
	C* cc=new C;
	
	//B* k=dynamic_cast<B*>(ab); //normal6no vuzuvaetc9
	
	B* c=ptr_cast<B,A>(ab);//tyt norm bez owibki
	cout <<endl<<endl;
	
	ab=cc;
	B* k=ptr_cast<B,A>(ab);//vubroc icklyucheni9
	
	return 0;
}

Как всегда немножко пояснения кода. Шаблон принимает два параметра первый класс который нужно проверить, а второй базовый класс, то есть класс указателя который мы передаем.

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

rss