我正在尝试使用带有 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 复制构造函数。
如果你想让它与任何 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)...);
}
};
关于c++ - 在模板类中使用 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39308966/