Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
#1

dynamic_cast() шаблон - C++

16.04.2013, 18:18. Просмотров 488. Ответов 5
Метки нет (Все метки)

Здорова!
Пытаюсь свой шаблон функции создать dynamic_cast() это ptr_cast() но ничо не получается.
Не могу никак сам шаблон написать вот код:
C++
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
//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>
T* ptr_cast(T* ptr)
{
    cout <<"mu v tyt"<<endl; //mu cyuda daje ne popadaem
    /*try
    {
        if(typeid(*ptr)==typeid(T))
            return ptr;
        else
            throw bad_cast();
    }
    catch(bad_cast& e)
    {
        cout <<e.what()<<endl;
    }*/
}
 
int main()
{
    B bb;
    B* bbb=&bb;
    A* ab=bbb;
    
    //B* k=dynamic_cast<B*>(ab); //normal6no vuzuvaetc9
    
    B* c=ptr_cast<B*>(ab);//owibky piwet
    
    
    return 0;
}
А вот ошибка:
./ex15_1.cpp: В функции «int main()»:
./ex15_1.cpp:41:22: ошибка: нет соответствующей функции для вызова «ptr_cast(A*&)»
./ex15_1.cpp:41:22: замечание: candidate is:
./ex15_1.cpp:17:4: замечание: template<class T> T* ptr_cast(T*)


Чо я токо не пробовал методом тыка но ничо не получается, не могу никак подобрать сам шаблон. Help!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2013, 18:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос dynamic_cast() шаблон (C++):

Написать шаблон ptr_cast, который работает аналогично dynamic_cast (задача из книжки Страуструпа) - C++
Кто может написать шаблон ptr_cast, который работает аналогично dynamic_cast? Задача из Страуструпа, не могу это реализовать?

dynamic_cast - C++
Подскажите пожалуйста, возникла проблема. Есть базовый клас CStep. И пока один наследник: class CStepMove : public CStep Ести вектор...

dynamic_cast - C++
Уважаемые, подскажите теорию. Как устроен данный каст? Не нашел его определений. В студии он зашит в библиотеку, подсказок в хелпе про него...

dynamic_cast - C++
Помогите разобраться с dynamic_cast, а точнее с вот этой записью void f() { A* pa = new A; B* pb = new B; void* pv =...

Dynamic_cast - C++
#include &lt;iostream&gt; #define STOP cin.get(); using std::cin; using std::cout; class A { public: // void foo()

dynamic_cast - C++
#include &lt;iostream&gt; class B { public: virtual void foo(){std::cout&lt;&lt;&quot;B&quot;;} private: int a; }; class D : public B { ...

5
Kastaneda
Нарушитель
Эксперт С++
4667 / 2873 / 232
Регистрация: 12.12.2009
Сообщений: 7,305
Записей в блоге: 2
Завершенные тесты: 1
16.04.2013, 18:23 #2
Вот так попробуй
C++
1
2
template<class T, class U>
T ptr_cast(U ptr)
кстати вот это
C++
1
2
3
4
5
6
7
8
9
10
11
try
    {
        if(typeid(*ptr)==typeid(T))
            return ptr;
        else
            throw bad_cast();
    }
    catch(bad_cast& e)
    {
        cout <<e.what()<<endl;
    }
очень напоминает бред
1
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
16.04.2013, 18:25  [ТС] #3
от когда я просто передаю тип B отак B* c=ptr_cast<B*>(bbb); то нормально вызывается шаблон, а когда через базовый класс пытаюсь вызвать отак B* c=ptr_cast<B*>(ab); то ошибка? Как правильно шаблон написать?

Добавлено через 1 минуту
Kastaneda, Чо бред это профи пишут так . Щас попробую вызвать, но мне нужно с одним наверно параметром шаблон чтобы было как dynamic_cast<один_параметр>();
0
Kastaneda
Нарушитель
Эксперт С++
4667 / 2873 / 232
Регистрация: 12.12.2009
Сообщений: 7,305
Записей в блоге: 2
Завершенные тесты: 1
16.04.2013, 18:34 #4
Цитата Сообщение от ninja2 Посмотреть сообщение
но мне нужно с одним наверно параметром шаблон чтобы было как dynamic_cast<один_параметр>();
можно и так вызывать, можно вообще без параметров, если есть почва для выведения типа. Выведение типов для функций устроено немного по другому, чем для классов.
1
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
16.04.2013, 18:48  [ТС] #5
Не знаю но нужно я думаю с одним параметром, чтобы было отак B* p=ptr_cast<B*>(ab); и если не соответствие типов то выброс исключения.
Отак короче можно как то сделать?
Ау кто знает?
В dynamic_cast так же сделано с одним параметром.

Добавлено через 1 минуту
мб не через typeid проверять типы, а как то по другому, хотя typeid rtti то по другому скорее всего нельзя ток через него. Значит вся проблема в написании шаблона.
0
Kastaneda
Нарушитель
Эксперт С++
4667 / 2873 / 232
Регистрация: 12.12.2009
Сообщений: 7,305
Записей в блоге: 2
Завершенные тесты: 1
16.04.2013, 18:51 #6
Цитата Сообщение от ninja2 Посмотреть сообщение
Не знаю но нужно я думаю с одним параметром, чтобы было отак B* p=ptr_cast<B*>(ab);
Так, как я показал выше, можно вызывать твою функцию в таком виде.
1
16.04.2013, 18:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2013, 18:51
Привет! Вот еще темы с ответами:

Использование dynamic_cast - C++
#include&lt;iostream&gt; #include&lt;locale.h&gt; using namespace std; class Base { public: virtual void f() {}; }; class Der :...

Работа с dynamic_cast - C++
Всем привет! Есть Абстрактный класс Transport. Есть три наследника: Plain, Train, Ship. Есть массив указателей на базовый класс который...

Объясните dynamic_cast - C++
дали задание разобраться с dynamic_cast, что это такое и с чем его едят. Прочитал информацию про него, но в программе он не работает(или...

Dynamic_cast и полиморфизм - C++
Задача: В листинге 15.16 после каждого блока try находятся два блока catch, поэтому исключение nbad_index приводит к вызову метода...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru