首页 > 解决方案 > 绑定 typedef 函数

问题描述

我有绑定函数到 std::function。函数声明:

typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int *attribList);

我的代码加载函数和绑定:

std::function<PFNWGLCREATECONTEXTATTRIBSARBPROC> function;
auto func = reinterpret_cast<PFNWGLCREATECONTEXTATTRIBSARBPROC>(getAnyGLFuncAddress("wglCreateContextAttribsARB"));
function = func;

function = func;导致编译错误。错误:

Error (active)  E0349   no operator "=" matches these operands  
operand types are: std::function<PFNWGLCREATECONTEXTATTRIBSARBPROC> = PFNWGLCREATECONTEXTATTRIBSARBPROC

我不明白为什么代码不起作用。如果我使用 using 声明函数,那么所有工作:

using WglCreateContextAttribsARB = HGLRC (WINAPI *) (HDC hDC, HGLRC hShareContext, const int *attribList);

标签: c++

解决方案


您的问题之一是您试图std::function仅根据其返回类型创建一个对象。该模板要求传递完整的函数类型,因此您还需要指定它需要什么。

您的分配错误来自尝试分配std::function模板化(无效)返回PFNWGLCREATECONTEXTATTRIBSARBPROCPFNWGLCREATECONTEXTATTRIBSARBPROC.

你在这里这样做:

std::function<PFNWGLCREATECONTEXTATTRIBSARBPROC> function = reinterpret_cast<PFNWGLCREATECONTEXTATTRIBSARBPROC>(...);

它失败了,因为您不能(不出所料)将一个表示函数的对象分配给它返回的值。如果你想复制(或移动)FNWGLCREATECONTEXTATTRIBSARBPROC到 astd::function然后也做FNWGLCREATECONTEXTATTRIBSARBPROC一个std::function。如果那不是一个选项(例如,如果它是不可修改的 API),您可以使用 lambda 来包装 C 样式函数。

如果要使用 a std::function,则必须通过指定其返回类型和参数来为其提供有效类型。像这样

std::function<FNWGLCREATECONTEXTATTRIBSARBPROC()> func;

(该函数将不接受任何参数)

旁注:永远不要使用 C 风格的函数指针,它们是邪恶的。using另外,当您说可以解决问题时,我不确定您的意思。除非您使用了未在问题中显示的不同代码,否则它不应该这样做(据我所知,尽管模板可能是 typedef 的怪异之处)。


推荐阅读