Lambda 无法传递给采用函数指针的模板化函数

问题描述 投票:0回答:1

我的设置

我已经设置了这些东西,

  1. 一个结构
  2. 一个模板化函数指针,将该结构体作为参数,并以 T 作为返回类型
  3. 一个模板化方法调用程序,它接受函数指针类型的回调,其中 T 作为函数指针和方法的返回类型。
// 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 设为静态,但不起作用。

c++ templates lambda callback function-pointers
1个回答
0
投票

如果 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 进行现场演示。

© www.soinside.com 2019 - 2024. All rights reserved.