2

我试图从另一个调用 GetProcAddress 的函数给出的 FARPROC 地址返回一个函数实例。想出了一个有趣的问题。这是功能:

template<class FT>
std::function<FT> to_function(FARPROC address) {
    return address;
}

稍后我将创建一个没有任何问题的无输入函数:

auto try1 = to_function<int()>(addr1);

然而,当函数接受输入时,visual c++ 11 编译器会爆炸:

auto try2 = to_function<int(int)>(addr2);

它正确地返回:

错误 C2197:“int (__stdcall *)(void)”:调用参数过多

所讨论的类型等同于 FARPROC,它是 GetProcAddress 返回的内容,与函数的参数列表无关。

我的问题是,在给定 to_function 的简单函数原型的情况下,我将如何通过将 FARPROC 转换为 std::function 的适当类型来解决这个问题?提前喝彩。

4

1 回答 1

4

我建议您先转换指针,然后将其包装到 std::function 中:

template<Signature>
std::function<Signature> to_function(FARPROC f)
{
    return std::function<Signature>(reinterpret_cast<Signature*>(f));
}

恕我直言,命名这样一个函数是个好主意cast_to_function。它的名字听起来应该很危险。

于 2012-11-26T20:03:21.100 回答