我的设置
我已经设置了这些东西,
// Setup
struct SomeParams
{
const SomeType someData;
};
// Function Pointer
template<typename T>
using FuncCallback = T(__stdcall*)
(
SomeParams params
);
// Method that takes the Function pointer
template<typename T>
T InvokerMethod(FuncCallback<T> callback);
问题
当我尝试通过传递 lambda 表达式来调用 InvokerMethod 时,编译器会崩溃。
auto myCallback = [](auto params)
{
return params.someData;
};
SomeType data = ptr->InvokerMethod(myCallback); // Compile Error
编译器泪流满面地显示此错误消息:
错误 E0304 - 没有函数模板“InvokerMethod”的实例与参数列表匹配
参数类型为:(lambda [](auto params)->auto)
与 STATIC 方法相同的 lambda 可以正常工作
// .h
static SomeType GetData(const SomeParams params);
// .cpp
SomeType GetData(const SomeParams params)
{
return params.someData;
}
SomeType data = ptr->InvokerMethod(GetData);
我想知道为什么传递静态方法时没有错误,但传递 lambda 时出错。
我可能会做一些愚蠢的事情,因为我是 cpp 的新手,我可能会忽略一些与此相关的关键知识。请指导我,任何帮助都会很棒!
我尝试将 lambda 设为静态,但不起作用。
如果 lambda 不捕获,则只能将其转换为函数指针,请参阅将捕获的 lambda 作为函数指针传递。
在OP的代码中,
auto myCallback = [](auto params)
{
return params.someData;
};
lambda 没有捕获,因此它可以自动衰减到函数指针。
代码无法编译的原因是在 lambda 函数中使用了
auto
。 SomeType data = ptr->InvokerMethod(myCallback); // Compile Error
无法推导出正确的类型来实例化 lambda 和 InvokerMethod
的模板。
相反,尝试显式给出类型
auto data = ptr->InvokerMethod<SomeType>(myCallback); // Compile Error
请参阅 https://godbolt.org/z/95TP6rn6T 进行现场演示。