当调用将回调作为参数的 WinAPI 函数时,通常有一个特殊的参数来将一些任意数据传递给回调。如果没有这样的东西(例如 SetWinEventHook
),我们可以理解哪个 API 调用导致给定回调的调用的唯一方法是具有不同的回调。当我们知道在编译时调用给定 API 的所有情况时,我们总是可以使用静态方法创建一个类模板,并在不同的调用方使用不同的模板参数实例化它。这是一项艰巨的工作,我不喜欢这样做。
如何在运行时创建回调函数以使它们具有不同的函数指针?
我看到了带有运行时程序集生成的 solution(抱歉,是俄语),但它不能跨 x86/x64 架构移植。
最佳答案
您可以使用 the closure API of libffi 。它允许您创建每个具有不同地址的蹦床。我实现了一个包装类 here ,虽然这还没有完成(只支持 int
参数和返回类型,你可以专门化 detail::type
来支持不仅仅是 int
)。一个更重量级的替代方案是 LLVM,不过如果你只处理 C 类型,libffi 可以很好地完成这项工作。
关于c++ - 在运行时创建具有唯一函数指针的函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26590685/