Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Информация о функции по указателю |
Автор: TDM 4.9.2010, 17:34 | ||||
Как узнать сколько у функции параметров и какого они типа если передавать только указатель на неё? Вот например код:
В MakeFunction должно определятся сколько в foo параметров и какого типа они. Есть вариант сделать кучу предопределённых типов и перегрузить MakeFunction много раз, типа:
но это не катит, по видимому надо с шаблонами как то мутить. не подскажете? |
Автор: TDM 4.9.2010, 18:47 | ||
создрать различные реализации MakeFunction(Func f) в зависимости от переданной функции (от колва пар-ов и их типов) но не перегружать её стотыщ раз Добавлено через 10 минут и 47 секунд всё, решил проблему |
Автор: boostcoder 4.9.2010, 19:12 |
как? Добавлено через 7 минут и 56 секунд ложь. легко. легко. |
Автор: Cheloveck 4.9.2010, 21:13 | ||
ну, а где демонстрация? Только давай так, мы имеем указатель на void, ибо типизированные указатели статические и всё заранее известно))
Заставь это работать. |
Автор: TDM 4.9.2010, 22:31 | ||
это конечно немного хак, но мне подходит
|
Автор: azesmcar 4.9.2010, 22:42 | ||
В void* указатели на функцию не передаются. Точнее может где-то и передаются, но так нельзя. полагаю имелось ввиду на этапе компиляции, что-то вроде этого
Добавлено через 4 минуты и 13 секунд это и к твоему коду относиться ![]() |
Автор: TDM 4.9.2010, 23:05 | ||
проверил, в vs передаётся и успешно запускается, в gcc тоже. ![]() |
Автор: Cheloveck 4.9.2010, 23:19 | ||
а мне показалось на этапе выполнения... |
Автор: azesmcar 5.9.2010, 00:13 |
ну..из этапа компиляции информацию можно легко передать в этап выполнения ![]() это ни о чем не говорит, сегодня передается - завтра может перестать. void* имеет достаточный размер, чтобы хранить указатель на любой объект, объект а не функцию. |
Автор: boostcoder 5.9.2010, 00:26 | ||||||||
так узнаешь кол-во аргументов:
так можешь получить mpl последовательность типов, и произвести с ними какие-то действия(добавить тип, удалить, изменить):
вот только тип по индексу 0 - возвращаемый тип. а дальше аргументы. так, из mpl последовательности, можешь собрать декларацию обратно:
вопросы? - нет вопросов. недавай. создай отдельную тему, тогда и пообщаемся ![]() ![]() ![]()
![]() |
Автор: TDM 5.9.2010, 01:45 |
boostcoder спасибо, boost хорошая штука по всей видимости) |
Автор: boostcoder 5.9.2010, 05:55 |
лучшая ![]() |
Автор: TDM 6.9.2010, 13:51 | ||||
выдаёт одинаковый размер |
Автор: djamshud 6.9.2010, 14:10 |
TDM, http://www.linux.org.ru/forum/development/5297559 |
Автор: azesmcar 6.9.2010, 14:27 | ||
я повторюсь еще раз. это НЕ переносимо. сегодня может работать а завтра нет. Программист, который будет сопровождать этот код (может быть даже ты сам) потом будет долго мучатся, чтобы понять причину. На другом компиляторе, на дрогой платформе, и даже на другой версии того же компилятора это может начать работать иначе.
|
Автор: TDM 6.9.2010, 15:17 |
ок, ясно |
Автор: TDM 8.9.2010, 17:56 |
boostcoder, в mpl sequence по 0 индексу получается тип 1го параметра, а возвращаемого нет. типы беру через boost::mpl::at_c |
Автор: boostcoder 8.9.2010, 18:02 |
возможно что-то напутал... чуть позже проверю... |
Автор: TDM 8.9.2010, 21:04 |
всё, разобрался |
Автор: boostcoder 8.9.2010, 21:14 | ||
все верно. напутал подбиблиотеку.
Добавлено @ 21:14 может поделитесь решением? ![]() |
Автор: TDM 8.9.2010, 22:07 | ||||
boostcoder, ок)
работает как я понял только для просто функций, для методов нет. с result_of работает всё:
|
Автор: MAKCim 8.9.2010, 23:06 | ||
ответ на первый вопрос топика так и остался загадкой... Добавлено через 3 минуты и 56 секунд
строго говоря никак все, что написали, не имеет ничего общего с первоначальной формулировкой задачи |
Автор: boostcoder 8.9.2010, 23:16 | ||
Добавлено @ 23:17 это почему? а это почему?
еще и это, почему? |
Автор: MAKCim 9.9.2010, 08:44 |
boostcoder, здесь определяют типы параметров/результата в общем-то статической сигнатуры просто по адресу без спец. средств ничего определить нельзя |
Автор: Earnest 9.9.2010, 08:51 | ||
Точно, если, конечно, автор имел в виду именно то, что написал - определение сигнатуры по УКАЗАТЕЛЮ. Ибо все эти ваши бусты и прочее мета-программирование работает вовсе не с указателями, а с точными типами и в компил-тайм. Но не исключено, что автор это и имел в виду. |
Автор: boostcoder 9.9.2010, 14:26 |
MAKCim, Earnest, или я вас не понимаю... или второе. т.е. адрес функции должен храниться в void* ? естественно. но даже если бы это можно было сделать в runtime, то от этого было бы мало толку, т.к. в runtime ни сигнатуру, ни тело функции не сгенерируешь. да и не надо это. пример: http://liveworkspace.org/code/700dba403c8a04c68f15069042845ede |
Автор: Sartorius 9.9.2010, 14:49 |
Это почему? Параметры в стек положить и руками можно, сгенерировать любой код и выполнить его хоть на стеке тоже не проблема. (x-bit--ы конечно всякие там и ASLR есть, но и их уже научились обходить. Да и не везде они есть) |
Автор: boostcoder 9.9.2010, 14:53 |
Sartorius, значит я не прав. т.к. с ассемблером не дружу. к тому же, не припомню ситуации, когда это мне было нужно. |
Автор: TDM 9.9.2010, 19:39 | ||
да именно это и хотел, немного не корректно написал. |