sch*_*hot 5

您可以声明一个指向函数的指针向量,该函数采用单个void *参数并返回,void *如下所示:

#include <vector>
std::vector<void *(*)(void *)> v;
Run Code Online (Sandbox Code Playgroud)

如果要存储具有不同原型的函数的指针,则将变得更加困难/危险。然后,您必须在将函数添加到向量中时将其转换为正确的类型,并在调用时将其转换回原始原型。只是一个例子,这变得多么丑陋:

#include <vector>

int mult(int a) { return 2*a; }

int main()
{
    int b;

    std::vector<void *(*)(void *)> v;
    v.push_back((void *(*)(void *))mult);
    b = ((int (*)(int)) v[0])(2);        // The value of b is 2.

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您可以使用typedef来部分隐藏函数强制转换语法,但是仍然存在将函数调用为错误类型的危险,从而导致崩溃或其他未定义的行为。所以不要这样做。

  • b 的值是 4 而不是 2 (2认同)