Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
|
|||
|---|---|---|---|
|
#18+
Пытаюсь в своей либе переделать сообщения на объекты с наследованием. Споткнулся на контроле типов. Надо как-то typeid().hash_code() дочернего узнать в родительском классе, но при этом ничего не писать в коде дочернего. Так не работает Код: plaintext 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. Результатtype class A * type A = E285AD67 type B = 216C60B2 Понятно что базовый понятия не имеет про дочерний, но может есть какой-то хитрый ход, которого я не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2017, 17:16 |
|
||
|
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2017, 19:19 |
|
||
|
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
|
|||
|---|---|---|---|
|
#18+
YesSqlDima T, Дима, оставь муму в покое. 20312833 . Другого варианта нет. Помучаю еще, этот typeid().hash_code() не нужен, если dynamic_cast использовать, но тормозит он, 10% производительности в минус при его применении. 36 млн. попугаев без него и всего 32 с ним. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2017, 19:41 |
|
||
|
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
|
|||
|---|---|---|---|
|
#18+
Dima TYesSqlDima T, Дима, оставь муму в покое. 20312833 . Другого варианта нет. Помучаю еще, этот typeid().hash_code() не нужен, если dynamic_cast использовать, но тормозит он, 10% производительности в минус при его применении. 36 млн. попугаев без него и всего 32 с ним. 10% попугаев на каждый тип сообщений? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2017, 20:22 |
|
||
|
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
|
|||
|---|---|---|---|
|
#18+
Dima TПомучаю еще, этот typeid().hash_code() не нужен, если dynamic_cast использовать, но тормозит он, 10% производительности в минус при его применении. 36 млн. попугаев без него и всего 32 с ним. dynamic_cast работает за счет той же инфы что и typeid. Поэтому в конструкторе предка если он и приводит к нужному типу, то все равно это UB. В конструкторе предка информации конкретном наследнике еще нет, т.к. она устанавливается конструктором наследника, который вызывается после предка. Хотя если это борланд то есть другие варианты.))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2017, 21:16 |
|
||
|
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
|
|||
|---|---|---|---|
|
#18+
Dima T, Гыгыгы, а ты всё продолжаешь на спичках экономить вместо того, чтобы заниматься делом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2017, 21:21 |
|
||
|
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
|
|||
|---|---|---|---|
|
#18+
Dima T, НЕЛЬЗЯ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2017, 22:08 |
|
||
|
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskydynamic_cast работает за счет той же инфы что и typeid. Поэтому в конструкторе предка если он и приводит к нужному типу, то все равно это UB. Да не приводит оно к наследнику, пока конструктор наследника не будет выполнен, точнее, пока управление не попадет в тело конструктора наследника. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2017, 22:14 |
|
||
|
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
|
|||
|---|---|---|---|
|
#18+
Dima T, по идее никак, это сделано для оптимизации но можно просто в конструктор как параметр передать уже готовый хеш, извратившись макросом(-ами) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2017, 22:43 |
|
||
|
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
|
|||
|---|---|---|---|
|
#18+
Dima TYesSqlDima T, Дима, оставь муму в покое. 20312833 . Другого варианта нет. Помучаю еще, этот typeid().hash_code() не нужен, если dynamic_cast использовать, но тормозит он, 10% производительности в минус при его применении. 36 млн. попугаев без него и всего 32 с ним. С dinamic_cast ты получишь O(N) а с хэшем O(log N). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2017, 04:08 |
|
||
|
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskydynamic_cast работает за счет той же инфы что и typeid. Да, но я могу его не считать каждый раз: при создании сообщения 1 раз посчитать и при создании получателя 1 раз указать принимаемый тип, а дальше сравнения size_t _type для контроля типа, а приведение static_cast ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2017, 09:13 |
|
||
|
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
|
|||
|---|---|---|---|
|
#18+
YesSqlDima Tпропущено... Помучаю еще, этот typeid().hash_code() не нужен, если dynamic_cast использовать, но тормозит он, 10% производительности в минус при его применении. 36 млн. попугаев без него и всего 32 с ним. 10% попугаев на каждый тип сообщений? Я меняю скорость прогона сообщений: примитивные обработчики и большие цепочки обработчиков. 10% это стоимость добавления dynamic_cast в каждую обработку сообщения. Т.к. обработка примитивная, то стоимость получается высокая. Если обработка будет в 100 раз тяжелее, то цена dynamic_cast будет 0.1%. Фигня, погрешность измерения. Можно и на dynamic_cast остановиться, но из-за этого становится менее выгодно делать длинные цепочки примитивных обработчиков. С другой стороны цепочки на практике не будут длинными: 3-5 обработчиков, а не 100+. Посчитать typeid().hash_code() стоит столько же как и dynamic_cast. Вобщем пока думаю, торопиться некуда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2017, 09:36 |
|
||
|
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
|
|||
|---|---|---|---|
|
#18+
Как вариант: отдать заполнение msg->type пользователю: хочет быстро - пусть вводит свою типизацию и использует static_cast, не хочет - dinamic_cast. Наверно на нем и остановлюсь. Все равно typeid().hash_code() в switch() не вставить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2017, 09:45 |
|
||
|
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
|
|||
|---|---|---|---|
|
#18+
Dima TНадо как-то typeid().hash_code() дочернего узнать в родительском классе, но при этом ничего не писать в коде дочернего.запоминай его в конструкторе, если он ещё не запомнен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2017, 05:12 |
|
||
|
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
|
|||
|---|---|---|---|
|
#18+
CEMbзапоминай его в конструкторе, если он ещё не запомнен. предлагаешь этот код в каждом конструкторе наследника писать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2017, 07:24 |
|
||
|
Наследование: можно получить typeid() дочернего класса в конструкторе базового?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)предлагаешь этот код в каждом конструкторе наследника писать?да. Более простого способа получить такой id я не вижу, только в конструкторе и деструкторе у нас тип(this) того класса, в котором мы в данный момент находимся. И, да, там у меня ошибка в логике, не надо делать проверку. Т.е. id в результате перезатрётся самым актуальным id-ом, что и требуется. Или вот такой извращенский вариант, если бы меня совсем прижало, я бы так сделал (в самом крайнем случае!): посмотреть на сгенерированный код, там компилятор подменяет данные текущего объекта, виртуальную таблицу и всё прочее, потом выполняет конструктор/деструктор, потом возвращает всё назад. Вот после подмены взять из "кеша" реальные данные, скастить их к текущему классу и выполнить нужные действия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2017, 12:00 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39427143&tid=2018229]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
170ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 281ms |

| 0 / 0 |
