【问题标题】:Function pointer to multiple argument C++11 std::function: Templating GetProcAddress指向多参数 C++11 std::function 的函数指针:模板化 GetProcAddress
【发布时间】:2012-11-26 04:56:34
【问题描述】:

我正在尝试从另一个调用 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 的适当类型来解决此问题?提前干杯。

【问题讨论】:

  • FARPROC 到底是什么?
  • 它只是一个函数指针 int (__stdcall *)(void)
  • 我想你在找std::bind
  • 直接对 GetProcAddress ((int(__stdcall*)(int)) GetProcAddress(...)) 的结果进行强制转换有什么问题?将其设置为 std::function 不会有任何安全性。

标签: c++ function templates c++11 getprocaddress


【解决方案1】:

我建议你先转换你的指针,然后把它包装成一个 std::function:

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

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

【讨论】:

  • 完美运行(签名前有类型名),非常感谢!不过,它确实提出了一个额外的问题……我想知道如何使这个解决方案适应 VC++ 11 处理它的各种函数调用约定。如果我要在重新解释转换之间插入 __cdecl 或 __stdcall,编译器将不喜欢它(返回语法错误)。那是因为这些调用声明不能在返回类型的后面,而是在返回类型的前面......我们必须以某种方式剖析签名以将其插入到中间。也许是实现可变参数模板后要解决的问题。
猜你喜欢
  • 2013-05-07
  • 2019-06-14
  • 1970-01-01
  • 2017-08-27
  • 2016-10-18
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多