Напишите шаблон ptr_cast, который работает как dynamic_cast, только он вместо возврата нуля генерирует исключение bad_cast.
Ну что ж господа начнем. Для начала мы должны разобраться непосредственно с самим dynamic_cast. Что это такое я не знаю. Поэтому я создам пост, который посвящу этой фигне.
Я подчитал и теперь примерно разобрался как мы его будем писать, прежде чем это делать вы должны понимать, что такое dynamic_cast() и typeid() . Мы будем делать шаблон с использованием typeid() я так думаю как то его попробовать применить.
Ну что ж казалось бы задачка простая, но я с ней промучился долго да и сделал не так как хотелось, чтобы шаблон был с одним параметром, сделал с двумя, ну да ладно зато работает так как надо. Вот код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
//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]