![]() |
|
|
![]()
|
|
| GoldFinch |
|
||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
а еще лучше выкинуть класс Imp_ из метода:
Добавлено через 14 минут и 30 секунд хм... только вот не получается получить адрес конструктора и деструктора =\ |
||||
|
|||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
значит всетаки так:
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
добавьте в структуру Imp_ :
и отпадет надобность писать .addr Это сообщение отредактировал(а) mes - 17.7.2009, 14:38 |
|||
|
||||
| GoldFinch |
|
||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
mes, я решил пойти еще дальше, и написать эту структуру так:
тогда ее можно использовать так:
|
||||
|
|||||
| GoldFinch |
|
||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
объявляю эту тему форума репозиторием версий кода импорта методов =)
перенес аргумент шаблона retT из класса в operator()
в стл или бусте есть класс template<typename T> struct какое_нибудь_имя{}; ? Добавлено через 7 минут и 15 секунд и есть ли гденить в бусте (в стл нет) аналог такой функции?
(нужна для приведения указателей на члены классов, т.к. они не приводятся приведеним типов в С-стиле) |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
Mне кажется Вас опять относит в сторону - снова перекладываете работу по контролю типов с компилятора на свои плечи... Это сообщение отредактировал(а) mes - 17.7.2009, 20:23 |
|||
|
||||
| GoldFinch |
|
||||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
mes, если компилятор не умеет присваивать такие указатели, мне приходится делать это за него.
переписал с использованием boost.preprocessor :
оригинальный класс:
Добавлено через 48 секунд косушки расползлись =\ |
||||||
|
|||||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
я так понял, что это проблема возникает при присвоении результата импорта. так ? импортом я никогда не занимался , но мне полагаю, что результат этой функции можно рассматривать, как указатель на обычную функцию. Тогда не возникнет проблем, в случае разных компиляторов (this как первый параметр или последний.) Вобщем я так вижу
Сейчас времени больше нет, приду если что не понятно поподробней опишу. |
||||
|
|||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
mes, там __thiscall, this передается в ecx
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
теперь тогда понятно в чем загвоздка. Имхо импортировать такую функцию как метод не красиво,хотя бы потому что работать будет работать только если Ваш код и длл откомпилированы однотипным компилятором. Как решение предполагаю, сделать адаптер, который при вызове импортируемой функции будет создавать для нее нужный контекст. Без низкоуровневого кода здесь не обойдется (тут я умываю руки), зато все зависимости останутся в этой обертке. |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
mes, так и есть, нужная мне длл, и мой код компилятся одним компилятором
|
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
в таком случае самым простым способом будет все таки union... (и программист как гарант типо-преобразований) мне кажется только сам union было бы удобно спрятать в Вашем адаптере (Imp_) :
ну и добавить в него необходимые проверки, в частности на размер данных юниона, и на соответсвитствие нужному компилятору. Это сообщение отредактировал(а) mes - 18.7.2009, 20:52 |
||||
|
|||||
| GoldFinch |
|
||||||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
ап.
практически всю информацию о методе можно выдрать из его типа. в msvc есть интринсик _AddressOfReturnAddress() возвращающий указатель на фрейм стека поэтому возможен следующий код
где
Добавлено через 9 минут и 56 секунд с макросами это будет
вместо
и никакого BOOST_PP Это сообщение отредактировал(а) GoldFinch - 6.8.2009, 14:30 |
||||||||
|
|||||||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
а вот адрес конструктора получить нельзя =\
Добавлено @ 14:49 другое дело, что конструктор можно объявить как обычный метод, и вызывать его явно. а с деструктором проблем нет, т.к. его сигнатура всегда известна Это сообщение отредактировал(а) GoldFinch - 7.8.2009, 14:52 |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |