Здравствуйте, IT, Вы писали:
IT>Здравствуйте, Oval, Вы писали:
O>>...в таблице виртуальных функций?
IT>Это же грубый хак. Что нужно сделать, может другим способом обойдёмся?
Точно, он самый! Но нужна таблица указателей на функции в количестве > 200 штук, и самому понятно ее иннициализировать неохота, вот и хочется переложить эту работу на компилятор
Re[3]: Как вызвать виртуальную функции по ее индексу...
Здравствуйте, Oval, Вы писали:
IT>>Это же грубый хак. Что нужно сделать, может другим способом обойдёмся?
O>Точно, он самый! Но нужна таблица указателей на функции в количестве > 200 штук, и самому понятно ее иннициализировать неохота, вот и хочется переложить эту работу на компилятор
Можно какие-нибудь макросы зарядить для этого дела, ну уж только не хаком иннициализировать
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Как вызвать виртуальную функции по ее индексу...
От:
Аноним
Дата:
02.04.03 05:08
Оценка:
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, Oval, Вы писали:
IT>>>Это же грубый хак. Что нужно сделать, может другим способом обойдёмся?
O>>Точно, он самый! Но нужна таблица указателей на функции в количестве > 200 штук, и самому понятно ее иннициализировать неохота, вот и хочется переложить эту работу на компилятор
IT>Можно какие-нибудь макросы зарядить для этого дела, ну уж только не хаком иннициализировать
Для 250 функций и все со своими уникальными именами, да для каждой новой реализации интерфейса — не реально.
Re[5]: Как вызвать виртуальную функции по ее индексу...
Здравствуйте, Аноним, Вы писали:
IT>>Можно какие-нибудь макросы зарядить для этого дела, ну уж только не хаком иннициализировать
А>Для 250 функций и все со своими уникальными именами, да для каждой новой реализации интерфейса — не реально.
А если это интерфейс, то зачем так извращаться?
Если нам не помогут, то мы тоже никого не пощадим.
Re[6]: Как вызвать виртуальную функции по ее индексу...
От:
Аноним
Дата:
02.04.03 05:32
Оценка:
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, Аноним, Вы писали:
IT>>>Можно какие-нибудь макросы зарядить для этого дела, ну уж только не хаком иннициализировать
А>>Для 250 функций и все со своими уникальными именами, да для каждой новой реализации интерфейса — не реально.
IT>А если это интерфейс, то зачем так извращаться?
Гибкий MIDI парсинг
Re[7]: Как вызвать виртуальную функции по ее индексу...
Здравствуйте, Аноним, Вы писали:
А>>>Для 250 функций и все со своими уникальными именами, да для каждой новой реализации интерфейса — не реально.
IT>>А если это интерфейс, то зачем так извращаться?
А>Гибкий MIDI парсинг
Ну смотри, потом не говори, что я тебя не предупреждал
Если нам не помогут, то мы тоже никого не пощадим.
Re[8]: Как вызвать виртуальную функции по ее индексу...
От:
Аноним
Дата:
02.04.03 08:40
Оценка:
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, Аноним, Вы писали:
А>>>>Для 250 функций и все со своими уникальными именами, да для каждой новой реализации интерфейса — не реально.
IT>>>А если это интерфейс, то зачем так извращаться?
А>>Гибкий MIDI парсинг
Вообще-то есть такая вещь, как указатель на виртуальную функцию. Который, в частности, хранит индекс в таблице (sizeof, соответственно, больше sizeof указателя на обычную функцию). И кроме того, он правильно обрабатывает виртуальное наследование.
Re[9]: Как вызвать виртуальную функции по ее индексу...
Здравствуйте, Аноним, Вы писали:
А>Вообще-то есть такая вещь, как указатель на виртуальную функцию. Который, в частности, хранит индекс в таблице (sizeof, соответственно, больше sizeof указателя на обычную функцию). И кроме того, он правильно обрабатывает виртуальное наследование.
А МОЖНО ПРО ЭТО ПОДРОБНЕЕ??? Что-то я еще никогда не слышал об указателях, размер которых изменяется... Как-то я был уверен, что все они (на интел-платформе, во всяком случае) равны размеру регистра...
Да здравствует мыло душистое и веревка пушистая.
Re[10]: Как вызвать виртуаьную функции по ее инексу...
Здравствуйте, Vamp, Вы писали:
А>> указатель на виртуальную функцию. Который, в частности, хранит индекс А>> в таблице (sizeof, соответственно, больше sizeof указателя на обычную функцию).
V> А МОЖНО ПРО ЭТО ПОДРОБНЕЕ??? Что-то я еще никогда не слышал об V> указателях, размер которых изменяется... Как-то я был уверен, что все V> они (на интел-платформе, во всяком случае) равны размеру регистра...
Указатель не то же, что адрес. В частности, указатель на функцию-член
далеко не обязательно содержит ее адрес. Часто, как и указал Vamp,
указатели на члены содержат некие индексы, по которым компилятор
может впоследствии определить, какую же функцию-член нужно вызывать.
Читать или искать в данном форуме "Указатели на члены".
Posted via RSDN NNTP Server 1.4.6 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[10]: Как вызвать виртуальную функции по ее индексу...
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, Аноним, Вы писали:
А>>>>Для 250 функций и все со своими уникальными именами, да для каждой новой реализации интерфейса — не реально.
IT>>>А если это интерфейс, то зачем так извращаться?
А>>Гибкий MIDI парсинг
IT>Ну смотри, потом не говори, что я тебя не предупреждал
IT>
Здравствуйте, Oval, Вы писали:
O>Здравствуйте, IT, Вы писали:
IT>>Здравствуйте, Аноним, Вы писали:
А>>>>>Для 250 функций и все со своими уникальными именами, да для каждой новой реализации интерфейса — не реально.
IT>>>>А если это интерфейс, то зачем так извращаться?
А>>>Гибкий MIDI парсинг
IT>>Ну смотри, потом не говори, что я тебя не предупреждал
IT>>
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, Oval, Вы писали:
O>>У меня почему-то это не работает, зато работает следующий код:
IT>Потому что нужно подбирать соглашение о вызовах, которое зависит от версии и настроек компилятора.
O>>typedef void (MyClass::*PF)();
IT>Здесь компилятор уже сам заботится о соглашениях о вызовах. Так пожалуй будет лучше, хотя это всё равно хак, грязный хак
Но он работает! Все-равно я скрою эти вызовывы в private части библиотечного класса.
Вот только бы еще проконтролировать что класс с виртуальными функциями наследовалься в первую очередь от базового интерфейсного а уж потом от других. Может "Loki-список типов" тут поможет?
Re[12]: Как вызвать виртуальную функции по ее индексу...
Здравствуйте, Oval, Вы писали:
O>Но он работает! Все-равно я скрою эти вызовывы в private части библиотечного класса.
Всё равно существует потенциальная зависимость от версий компиляторов.
O>Вот только бы еще проконтролировать что класс с виртуальными функциями наследовалься в первую очередь от базового интерфейсного а уж потом от других. Может "Loki-список типов" тут поможет?
По идее не должно быть проблем, но нужно проверить.
Если нам не помогут, то мы тоже никого не пощадим.
Re[13]: Как вызвать виртуальную функции по ее индексу...
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, Oval, Вы писали:
O>>Но он работает! Все-равно я скрою эти вызовывы в private части библиотечного класса.
IT>Всё равно существует потенциальная зависимость от версий компиляторов.
Будет непереносимая библиотека для конкретного устройства и компилятора.
O>>Вот только бы еще проконтролировать что класс с виртуальными функциями наследовалься в первую очередь от базового интерфейсного а уж потом от других. Может "Loki-список типов" тут поможет?
IT>По идее не должно быть проблем, но нужно проверить.
100% если самый базовый класс не мой и содержит виртуальные функции то необходимо смещение индексов. Естественно не пойми какое(лучше контролировать первичность моего класса в наследовании).
Re[14]: Как вызвать виртуальную функции по ее индексу...
Здравствуйте, Oval, Вы писали:
O>>>Вот только бы еще проконтролировать что класс с виртуальными функциями наследовалься в первую очередь от базового интерфейсного а уж потом от других. Может "Loki-список типов" тут поможет?
IT>>По идее не должно быть проблем, но нужно проверить.
O>100% если самый базовый класс не мой и содержит виртуальные функции то необходимо смещение индексов. Естественно не пойми какое(лучше контролировать первичность моего класса в наследовании).
Ты пробовал или просто так думаешь?
Если нам не помогут, то мы тоже никого не пощадим.
Re[15]: Как вызвать виртуальную функции по ее индексу...
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, Oval, Вы писали:
O>>>Вот только бы еще проконтролировать что класс с виртуальными функциями наследовалься в первую очередь от базового интерфейсного а уж потом от других. Может "Loki-список типов" тут поможет?
IT>>По идее не должно быть проблем, но нужно проверить.
O>100% если самый базовый класс не мой и содержит виртуальные функции то необходимо смещение индексов. Естественно не пойми какое(лучше контролировать первичность моего класса в наследовании).
IT>Ты пробовал или просто так думаешь?
Вообще я так думаю. Ну а как иначе — 1)указатели на виртуальные функции(ненужные) базового класса пойдут наверняка первыми; 2) их количество для вычесления смещения средствами языка имхо не узнать.
Re[16]: Как вызвать виртуальную функции по ее индексу...
Здравствуйте, Oval, Вы писали:
O>Здравствуйте, IT, Вы писали:
IT>Здравствуйте, Oval, Вы писали:
O>>>Вот только бы еще проконтролировать что класс с виртуальными функциями наследовалься в первую очередь от базового интерфейсного а уж потом от других. Может "Loki-список типов" тут поможет?
IT>>По идее не должно быть проблем, но нужно проверить.
O>100% если самый базовый класс не мой и содержит виртуальные функции то необходимо смещение индексов. Естественно не пойми какое(лучше контролировать первичность моего класса в наследовании).
IT>Ты пробовал или просто так думаешь? O>Вообще я так думаю. Ну а как иначе — 1)указатели на виртуальные функции(ненужные) базового класса пойдут наверняка первыми; 2) их количество для вычесления смещения средствами языка имхо не узнать.
Уже в ванной под душем нашел решение — а ведь можно попробовать поискать в ВТ адрес функции-заглушки, которая никогда не будет переопределена и на основе ее найти смещение!