![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
TDM |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 1.2.2006 Где: SPB Репутация: нет Всего: нет |
Как узнать сколько у функции параметров и какого они типа если передавать только указатель на неё?
Вот например код:
В MakeFunction должно определятся сколько в foo параметров и какого типа они. Есть вариант сделать кучу предопределённых типов и перегрузить MakeFunction много раз, типа:
но это не катит, по видимому надо с шаблонами как то мутить. не подскажете? |
||||
|
|||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 3 Всего: 32 |
никак по видимому, да конкретнее, что надо сделать? -------------------- ![]() |
|||
|
||||
TDM |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 1.2.2006 Где: SPB Репутация: нет Всего: нет |
создрать различные реализации MakeFunction(Func f) в зависимости от переданной функции (от колва пар-ов и их типов) но не перегружать её стотыщ раз Добавлено через 10 минут и 47 секунд всё, решил проблему Это сообщение отредактировал(а) TDM - 4.9.2010, 18:48 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
как? Добавлено через 7 минут и 56 секунд ложь. легко. легко. |
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 3 Всего: 32 |
ну, а где демонстрация? Только давай так, мы имеем указатель на void, ибо типизированные указатели статические и всё заранее известно))
Заставь это работать. Это сообщение отредактировал(а) Cheloveck - 4.9.2010, 21:24 -------------------- ![]() |
|||
|
||||
TDM |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 1.2.2006 Где: SPB Репутация: нет Всего: нет |
||||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
В void* указатели на функцию не передаются. Точнее может где-то и передаются, но так нельзя. полагаю имелось ввиду на этапе компиляции, что-то вроде этого
Добавлено через 4 минуты и 13 секунд это и к твоему коду относиться ![]() |
|||
|
||||
TDM |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 1.2.2006 Где: SPB Репутация: нет Всего: нет |
проверил, в vs передаётся и успешно запускается, в gcc тоже. ![]() Это сообщение отредактировал(а) TDM - 4.9.2010, 23:08 |
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 3 Всего: 32 |
а мне показалось на этапе выполнения... -------------------- ![]() |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
ну..из этапа компиляции информацию можно легко передать в этап выполнения ![]() это ни о чем не говорит, сегодня передается - завтра может перестать. void* имеет достаточный размер, чтобы хранить указатель на любой объект, объект а не функцию. |
|||
|
||||
boostcoder |
|
||||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
так узнаешь кол-во аргументов:
так можешь получить mpl последовательность типов, и произвести с ними какие-то действия(добавить тип, удалить, изменить):
вот только тип по индексу 0 - возвращаемый тип. а дальше аргументы. так, из mpl последовательности, можешь собрать декларацию обратно:
вопросы? - нет вопросов. недавай. создай отдельную тему, тогда и пообщаемся ![]() ![]() ![]()
![]() Это сообщение отредактировал(а) boostcoder - 5.9.2010, 05:55 |
||||||||
|
|||||||||
TDM |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 1.2.2006 Где: SPB Репутация: нет Всего: нет |
boostcoder
спасибо, boost хорошая штука по всей видимости) |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
TDM |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 1.2.2006 Где: SPB Репутация: нет Всего: нет |
||||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 8 Всего: 39 |
-------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
я повторюсь еще раз. это НЕ переносимо. сегодня может работать а завтра нет. Программист, который будет сопровождать этот код (может быть даже ты сам) потом будет долго мучатся, чтобы понять причину. На другом компиляторе, на дрогой платформе, и даже на другой версии того же компилятора это может начать работать иначе.
|
|||
|
||||
TDM |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 1.2.2006 Где: SPB Репутация: нет Всего: нет |
ок, ясно
|
|||
|
||||
TDM |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 1.2.2006 Где: SPB Репутация: нет Всего: нет |
boostcoder,
в mpl sequence по 0 индексу получается тип 1го параметра, а возвращаемого нет. типы беру через boost::mpl::at_c |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
возможно что-то напутал... чуть позже проверю...
|
|||
|
||||
TDM |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 1.2.2006 Где: SPB Репутация: нет Всего: нет |
всё, разобрался
|
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
все верно. напутал подбиблиотеку.
Добавлено @ 21:14 может поделитесь решением? ![]() Это сообщение отредактировал(а) boostcoder - 8.9.2010, 22:09 |
|||
|
||||
TDM |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 1.2.2006 Где: SPB Репутация: нет Всего: нет |
boostcoder,
ок)
работает как я понял только для просто функций, для методов нет. с result_of работает всё:
|
||||
|
|||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
ответ на первый вопрос топика так и остался загадкой...
Добавлено через 3 минуты и 56 секунд
строго говоря никак все, что написали, не имеет ничего общего с первоначальной формулировкой задачи -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
boostcoder,
здесь определяют типы параметров/результата в общем-то статической сигнатуры просто по адресу без спец. средств ничего определить нельзя -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Точно, если, конечно, автор имел в виду именно то, что написал - определение сигнатуры по УКАЗАТЕЛЮ. Ибо все эти ваши бусты и прочее мета-программирование работает вовсе не с указателями, а с точными типами и в компил-тайм. Но не исключено, что автор это и имел в виду. -------------------- ... |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
MAKCim, Earnest, или я вас не понимаю... или второе.
т.е. адрес функции должен храниться в void* ? естественно. но даже если бы это можно было сделать в runtime, то от этого было бы мало толку, т.к. в runtime ни сигнатуру, ни тело функции не сгенерируешь. да и не надо это. пример: http://liveworkspace.org/code/700dba403c8a...f15069042845ede Это сообщение отредактировал(а) boostcoder - 9.9.2010, 15:20 |
|||
|
||||
Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 8 Всего: 37 |
Это почему? Параметры в стек положить и руками можно, сгенерировать любой код и выполнить его хоть на стеке тоже не проблема. (x-bit--ы конечно всякие там и ASLR есть, но и их уже научились обходить. Да и не везде они есть) |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
Sartorius, значит я не прав. т.к. с ассемблером не дружу.
к тому же, не припомню ситуации, когда это мне было нужно. |
|||
|
||||
TDM |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 1.2.2006 Где: SPB Репутация: нет Всего: нет |
||||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |