Можно ли динамически создавать и хранить указатели для функций, для которых мы не знаем число и тип аргументов? - PullRequest
0 голосов
/ 29 декабря 2018

Мне дали несколько фиктивных функций, каждая из которых имеет свой собственный тип возвращаемого значения, число (и типы) аргументов, и я пытаюсь найти способ автоматического создания для них указателей на функции правильного типа.затем сохраните их внутри карты для извлечения по желанию.Короче говоря, я застрял в создании фактических указателей на функции.Способ их хранения на карте - это отдельный вопрос из-за их типов переменных.

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

Код для вышеупомянутой функции:

template <typename retType, typename ... argTypes> retType makeFuncPtr(void* funcAddr) {
    retType (*ptr)(argTypes) = funcAddr;
    return ptr;
}

Я получаю сообщение об ошибке "Тип объявления содержит нерасширенный пакет параметров"argTypes».Что я делаю не так, а также какой тип возврата является подходящим для этой функции, поскольку я на самом деле не уверен в этом?

1 Ответ

0 голосов
/ 29 декабря 2018

Ошибка, о которой вы спрашиваете, потому что в строке:

retType (*ptr)(argTypes) = funcAddr;

нет ... после argTypes.Обратите внимание, что это на самом деле не исправит ситуацию, потому что указатель void не может быть преобразован в указатель другого типа без приведения.А также вы не можете преобразовать указатель функции в retType.

Если функции имеют разные сигнатуры, это довольно сложная проблема, я предлагаю вам взглянуть на libffi, здесь сложная часть не хранит указатели на функции(если они не являются нестатическими функциями-членами, вы можете просто привести их к void * и сохранить их), сложная часть использует сохраненное значение указателя для выполнения вызова.

libffi дает вам возможностьОпишите соглашение о вызове функции, тип возвращаемого значения и ожидаемые аргументы.Затем вы можете написать код, который сравнивает фактически полученные аргументы и либо конвертировать, либо выдавать ошибку в зависимости от ситуации.С C ++ можно было бы даже создать это описание программно (ваша шаблонная функция будет принимать указатель функции в качестве параметра, а затем использовать пакет параметров для сопоставления со значениями типа аргумента libffi).

...