Могу ли я извлечь аргументы функции из указателя функции? - PullRequest
1 голос
/ 09 апреля 2011

Могу ли я извлечь дополнительную информацию (например, количество аргументов и их типы) из указателя функции?Если (скорее всего) нет, то как лучше всего разрешить программисту передать указатель на функцию и переменное число аргументов EDIT: I meant that it should allow functions with different number of arguments, которое требуется, чтобы убедиться, что программист не передал невернотипы аргументов.

Что я хочу сделать: Предоставить функции и их аргументы языку сценариев, не прибегая к тому, чтобы программист набирал аргументы вручную (и, следовательно, допускал ошибки при прохождении программиста).указатель на функцию и неправильные аргументы, которые принимает функция).

Еще немного уточнения: Я должен иметь возможность вывести имя функции и типы аргументов для целей документирования.

----------------- РЕШЕНИЕ -----------------

Ответ Джеймса - это то, что я искал.Вот код, представляющий собой бит запутанный, который должен помочь любому, кто застрял в такой же ситуации.

boost::function_traits<boost::remove_pointer
                         <BOOST_TYPEOF(&SomeFunction)>::type>::arg2_type);

Если вам требуется вывод, используйте RTTI (при условии, что в компиляторе включен RTTI)

std::cout << typeid(boost::function_traits<boost::remove_pointer
    <BOOST_TYPEOF(&SomeFunction)>::type>::arg2_type).name() << std::endl;

Ответы [ 4 ]

3 голосов
/ 09 апреля 2011

Вы можете получить функции типа arity, return и типы функций, используя function_traits из библиотеки Boost.TypeTraits .

Чтобы полностью включить описанный вами сценарий того, чтопо сути, это функция с переменным числом аргументов, которая является типобезопасной, вам действительно нужны шаблоны с переменными параметрами, новая функция добавляется в C ++ 0x и поддерживается некоторыми недавно выпущенными компиляторами (например, Clang, gcc).Если вам нужно что-то более обширное, вам, вероятно, потребуется реализовать собственную систему типов времени выполнения.

0 голосов
/ 09 апреля 2011

Возможно, вы могли бы преобразовать вывод doxygen xml в соответствующие объявления / метаданные для вашего языка сценариев.Информация в этом другом вопросе может помочь вам начать.В противном случае SWIG может помочь вам, он предназначен для создания межязыковых оболочек и, вероятно, может генерировать их, совместимые с вашим языком сценариев по вашему выбору.

0 голосов
/ 09 апреля 2011

Вы можете рассмотреть возможность использования библиотеки Boost :: Function и Boost :: TypeTraits .Я считаю, что Boost :: Function облегчает работу с указателями на функции и позволяет использовать функциональные объекты универсальным образом (т. Е. Вы не ограничены типом функционального объекта, который вызывает боль), которые в целом гораздо лучшенеобработанные указатели функций

0 голосов
/ 09 апреля 2011

Я не совсем понимаю, что вы ищете, но boost . function_types может сообщить вам тип возвращаемого значения, количество аргументов и типы аргументов указателя на функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...