如何将函数转换为 lambda 函数
How to transform function to lambda function
我有函数:
FARPROC PUDSClass::getFunction(LPSTR szName)
{
if(handleDLL == NULL)
{
return NULL;
}
return GetProcAddress(handleDLL, szName);
}
我正在尝试将其重写为 lambda 函数。
FARPROC lambda_decToStrHex = [&](LPSTR szName)
{
if (handleDLL == NULL)
{
return NULL;
}
return GetProcAddress(handleDLL, szName);
};
但是我收到类型不一致的"int"和"int(属性(stdcall(*((("的错误。
如果我这样写,它可以正常工作:
auto getFunction = [&](LPSTR szName)
{
return GetProcAddress(handleDLL, szName);
};
据我了解,lambda 无法处理返回 NULL 或 GetProcAddress((,但为什么普通函数可以这样做呢?
FARPROC lambda_decToStrHex = ...;
这将创建一个变量lambda_decToStrHex
,它的类型是FARPROC
,根据文档,它被定义为
int (FAR WINAPI * FARPROC) ()
它是一个返回 int 且不接受任何参数的函数。这与您的 lambda 类型根本不匹配。
如果有的话,你需要一个 lambda 可以衰减到的正确类型的函数指针,一个接受 C 字符串并返回FARPROC
指针的函数(简而言之:指向返回函数指针的函数的指针(:
FARPROC (*lambda_decToStrHex)(LPSTR) = ...;
唯一:你的lambda不能衰减到函数指针,因为它有一个非空闭包:
... = [&](LPSTR name) { /* ... */ };
// ^ ^ uses dllHandle, which thus gets part of closure
因此,剩下的就是将 lambda 分配给您的 lambda 的变量类型,您可以通过auto
获得该类型。
编辑:return NULL;
:
'Lambda' 在这里是一个红鲱鱼,它不是 lambda 的问题,而是任何推导出返回类型 (auto f() { ... }
( 的函数的问题。NULL
通常被定义为(void*)0
,(但也可以看起来不同(,所以你在(在本例中(lambda的两个出口点得到两种不同的返回类型(void*
和FARPROC
(。现在应该推导出哪种返回类型?
起初,您根本不应该再使用NULL
,它是一个来自 C 的宏,而 C++ 提供了以下关键字:nullptr
。仅,它不会解决问题,因为它有自己的类型(std::nullptr_t
(,这仍然与FARPROC
不同。然后,强制转换可以解决问题(实际上也适用于宏(:
return static_cast<FARPROC>(nullptr);
现在两个出口点具有相同的返回类型,我们很好。尾随返回类型可实现相同的结果:
[&](LPSTR) -> FARPROC { ... }
nullptr
会自动衰减到正确的指针类型(因此您不需要强制转换(; 但是,NULL
宏,如果没有强制转换并且取决于定义方式,可能会(但不必(失败。
另一种解决方案是单个明确定义的退出点:
[&](LPSTR)
{
FARPROC function = nullptr;
if(dllHandle)
function = get();
return function;
}
那么为什么它与正常功能一起工作?好吧,您显式指定了返回类型(FARPROC f(...)
(,这相当于具有尾随返回类型。此外,它编译的事实和错误消息:
"int" and "int (attribute(stdcall)*)()"
^^^
揭示您的编译器显然定义了没有void*
强制转换的NULL
:
#define NULL 0
或类似 –0
字面也衰减为空指针......
>由于您在正常函数中指定了返回类型FARPROC
,因此NULL
(0
,这是int
类型(将隐式转换为FARPROC
类型(int (attribute(stdcall)*)()
(。
您可以使用使用->
指定带有 lambda 的返回类型:
auto lambda_decToStrHex = [&](LPSTR szName) -> FARPROC
{
if (handleDLL == NULL)
{
return NULL;
}
return GetProcAddress(handleDLL, szName);
};
- 可组合的lambda/std::函数与std::可选
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 如何将lambda作为模板类的成员函数参数
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 模板函数指针和lambda
- 两组使用lambda函数的大括号
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 在构造函数中使用 lambda 的 C++ 类
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- 为什么我不能在 constexpr lambda 函数中使用 std::tuple
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- C++:Lambda 函数指针转换的用例是什么?
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- std::映射服装比较函数和函数/lambda错误
- 在可移动类型的构造函数 lambda 中捕获此内容的安全使用
- 排序测试模板化函数 lambda:非法使用此类型作为表达式
- 将匿名函数(lambda)保存为函数类型变量
- 如何编写将自身作为回调传递的匿名函数/lambda