2012-11-26 133 views
2

我想从另一个调用GetProcAddress的函数给出的FARPROC地址返回一个函数实例。提出了一个有趣的问题。这里的功能:函数指针到多个参数C++ 11 std :: function:模板GetProcAddress

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 *)(vo id)':调用的参数太多

所讨论的类型与FARPROC相当,即GetProcAddress返回的内容,与函数的参数列表无关。

为了说明问题,我的问题是如何通过将FARPROC强制转换为std :: function的适当类型来解决此问题?提前欢呼。

+2

“FARPROC”究竟是什么? –

+0

它只是一个函数指针int(__stdcall *)(void) – austere

+1

我认为你正在寻找['std :: bind'](http://en.cppreference.com/w/cpp/utility/functional/bind) 。 –

回答

3

我建议你先投你的指针,然后把它包装成一个std ::功能:

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

恕我直言,这将是一个好主意来命名这样的功能cast_to_function。它的名字听起来很危险。

+1

工作完美(签名前的类型名称),非常感谢!它确实带来了一个额外的问题,虽然... 我想知道如何适应这个解决方案,VC++ 11负责其各种函数调用约定。如果我要在reinterpret强制转换之间插入__cdecl或__stdcall,编译器将不会喜欢它(返回语法错误)。这是因为这些调用声明不能落后于返回类型之前...... 不知何故,我们必须剖析签名以将其插入到中间。也许在实现可变参数模板后需要解决一个问题。 – austere