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,则不会像普通函数调用那样执行检查或转换。如果你没有对函数类型使用类型擦除,你可以很容易地为上面的代码添加类型安全,但我猜你会的。