C++ 调用函数指针与任意数量的变量
C++ Call function pointer with any amount of variables
我目前正在这样调用函数指针
int(*function)(int a, int b, bool c) = (int(*)(int, int, bool))0x12341234;
但是我有一个问题,如果我想在不指定参数的情况下调用一个函数指针怎么办?
即如果我知道该函数位于 0x12341234 并且我知道参数 (int, int, bool) 有一种方法所以我可以这样称呼它:
void callFunctionUsingMemAddress(int funcaddr, ...)
{
executefunction(funcaddr, ...);
}
然后我会像这样调用位于 0x12341234 的函数
callFunctionUsingMemAddress(0x12341234, 54, 77, false);
根据我所做的研究,我认为我需要使用可变参数,尽管我还没有找到使用可变参数的好方法。
你可以的...
#include <iostream>
int f(int a, int b, bool c)
{
return c ? a + b : a - b;
}
template <typename R, typename... Args>
R callFunctionUsingMemAddress(void* funcaddr, Args... args)
{
typedef R(*Function)(Args...);
Function fnptr = (Function)funcaddr;
return fnptr(args...);
}
int main()
{
std::cout << callFunctionUsingMemAddress<int>((void*)f, 42, 10, true) << '\n';
std::cout << callFunctionUsingMemAddress<int>((void*)f, 42, 10, false) << '\n';
}
也就是说,要非常小心:如果您调用的函数需要一个 double 而您传递了一个 int
,则不会像普通函数调用那样执行检查或转换。如果你没有对函数类型使用类型擦除,你可以很容易地为上面的代码添加类型安全,但我猜你会的。
我目前正在这样调用函数指针
int(*function)(int a, int b, bool c) = (int(*)(int, int, bool))0x12341234;
但是我有一个问题,如果我想在不指定参数的情况下调用一个函数指针怎么办?
即如果我知道该函数位于 0x12341234 并且我知道参数 (int, int, bool) 有一种方法所以我可以这样称呼它:
void callFunctionUsingMemAddress(int funcaddr, ...)
{
executefunction(funcaddr, ...);
}
然后我会像这样调用位于 0x12341234 的函数
callFunctionUsingMemAddress(0x12341234, 54, 77, false);
根据我所做的研究,我认为我需要使用可变参数,尽管我还没有找到使用可变参数的好方法。
你可以的...
#include <iostream>
int f(int a, int b, bool c)
{
return c ? a + b : a - b;
}
template <typename R, typename... Args>
R callFunctionUsingMemAddress(void* funcaddr, Args... args)
{
typedef R(*Function)(Args...);
Function fnptr = (Function)funcaddr;
return fnptr(args...);
}
int main()
{
std::cout << callFunctionUsingMemAddress<int>((void*)f, 42, 10, true) << '\n';
std::cout << callFunctionUsingMemAddress<int>((void*)f, 42, 10, false) << '\n';
}
也就是说,要非常小心:如果您调用的函数需要一个 double 而您传递了一个 int
,则不会像普通函数调用那样执行检查或转换。如果你没有对函数类型使用类型擦除,你可以很容易地为上面的代码添加类型安全,但我猜你会的。