c++ - 绑定 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);
解决方案
您的问题之一是您试图std::function
仅根据其返回类型创建一个对象。该模板要求传递完整的函数类型,因此您还需要指定它需要什么。
您的分配错误来自尝试分配std::function
模板化(无效)返回PFNWGLCREATECONTEXTATTRIBSARBPROC
到PFNWGLCREATECONTEXTATTRIBSARBPROC
.
你在这里这样做:
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 的怪异之处)。
推荐阅读
- python - 在 Python 中更新实例变量时出现意外行为
- python - 实例在python中是什么意思?
- c# - 当从多框架控制台应用程序引用 .netcore dll 时,NU1201 项目与 net472 不兼容
- python - Python 是否禁止使用两个外观相似的 Unicode 标识符?
- amazon-dynamodb - 您可以使用 Boto3 控制对 DynamoDB 的写入速度吗?
- apache-pulsar - 在 Windows Docker 中安装 Apache Pulsar
- python - 使用python列出文档中的子集合
- deep-learning - 将卷积特征回归到旋转的四元数表示是什么意思?
- angular - 使用 Angular 9 中未涵盖的 setTimeout 测试用例加载服务?
- asp.net - ASP.NET 应用程序的标准安装目录