Предполагая, что у меня есть адрес памяти времени выполнения функции в приложении, и я знаю тип возвращаемого значения указанной функции, можно ли вызвать функцию, зная тип возвращаемого значения функции, ее аргументы и соглашение о вызовах, используя вариативный шаблон?
Шаблонная функция должна поддерживать возвращаемые типы как void, так и non-void. Из-за того, что мы имеем дело с указателями на функции, компилятор не должен жаловаться, несмотря на return ptr.
Я думал сделать что-то вроде этого:
template<typename ReturnType, typename Address, typename... Args>
ReturnType function_caller(Address address, Args... args)
{
ReturnType(*ptr)(Args...) = address;
return ptr(args...);
}
int main()
{
auto address = 0x100;
auto address2 = 0x200;
function_caller<void>(&address, 1, 1); // Function with return type void.
int result = function_caller<int>(&address2, 1, 2, 3.f, "hello");
// result should contain the int value we received by calling the function at 0x200
}
К сожалению, компилятор выдает ошибку C2440: он не может преобразовать адрес address
в 'ReturnType (__cdecl *)(int,int)
'
Я был бы очень признателен за вашу помощь с этой проблемой. Я знаю, что мог бы просто разделить эту оболочку на 2 функции: одну для вызовов void и одну для вызовов non-void, но я надеюсь, что есть более элегантное решение с поддержкой шаблонов.
Спасибо и хорошего дня!
const char*
илиconst char[6]
? Я почти уверен, что это последнее. - person Mooing Duck   schedule 25.08.2020