模板化 lambda 的类型是什么?

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

以下代码尝试创建一个 templated lambda 并将其传递给调用它的函数。但是编译失败,因为

lambda
参数的类型错误。

#include <functional>

void foo(std::function<void(void)>&lambda) {
  lambda.template operator()<int>();
}

int main() {
  auto f = []<class T>() {};
  foo(f);
}

我应该如何定义接收模板化 lambda 的参数类型?

使用

auto
可以工作,但我需要显式类型(因此我可以修改
foo
以返回 lambda 返回的任何内容)。

void foo(auto &lambda) { // Works but not what I want

我尝试过这个但没有编译:

template<class T>
void foo(std::function<void<T>(void)>&lambda) {
c++ templates lambda c++20
1个回答
0
投票

所谓的模板 lambda 和普通 lambda 之间的区别在于

operator()
是一个模板。否则 lambda 本身的类型没有太大区别。它是一种独特的未命名类型。

我应该如何定义接收模板化 lambda 的参数类型?

与非模板化 lambda 相同。

...但我需要显式类型(这样我可以修改 foo 以返回 lambda 返回的任何内容)。

您不需要知道 lambda 的类型。

 auto foo(auto &lambda) {
        auto ret = lambda();
        return ret;
 }

lamdba的返回类型是

decltype(lambda())
(如果需要可以添加
std::decay_t
)。

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