gpt4 book ai didi

c++ - 在模板类中使用 lambda

转载 作者:可可西里 更新时间:2023-11-01 17:30:52 26 4
gpt4 key购买 nike

我正在尝试使用带有 lambda 函数参数的模板类。但是,我不明白如何传递参数。到目前为止,这是我尝试过的:

#include <iostream>
using namespace std;

template <class F>
class A {
public:

int f(int i)
{
return F(i); //*
}
};

int main(int argc, const char * argv[]) {
auto f = [](int i){return i+5;};
A<decltype(f)> a;
cout << a.f(5);
return 0;
}

我在标记的行中发现错误。

有人可以帮忙吗?

最佳答案

您的示例不起作用,因为 F 是一种类型,而不是可调用对象。下一步是通过创建成员变量来实例化它。

template <class F>
class A {
F function;
public:
int f(int i) {
return function(i);
}
};

但是,这仍然行不通,因为 lambda 默认构造函数已被删除。这意味着我们需要另一种方式来构造function。这可以通过将参数传递给 A 的构造函数来实现。

template<typename F>
class A {
F function;
public:
A(const F& f) : function(f) {}
int f(int i) {
return function(i);
}
};

// ...

auto f = [](int i) { return i+5; };
A<decltype(f)> a(f);

这使用了未删除的 lambda 复制构造函数。

Live example

如果你想让它与任何 lambda 一起工作,你可以添加更多魔法。

template<typename F>
class A {
F function;

public:
A(const F& f) : function(f) {}

template<typename ...Args>
auto f(Args... args) -> std::result_of_t<F(Args...)> {
return function(std::forward<Args>(args)...);
}
};

Live example

关于c++ - 在模板类中使用 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39308966/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com