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)': 呼び出しの引数が多すぎます

問題の型は、関数の引数リストに関係なく、GetProcAddress によって返されるものである FARPROC と同等です。

私の質問は、要するに、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));
}

IMHO そのような関数に名前を付けるのは良い考えcast_to_functionです。その名前は危険に聞こえるはずです。

于 2012-11-26T20:03:21.100 に答える