Ofe*_*gen 8 c++ lambda templates c++11
我正在尝试使用带有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;
}
Run Code Online (Sandbox Code Playgroud)
我在标记的行中出错.
有人可以帮忙吗?
您的示例不起作用,因为它F是一个类型,而不是一个可调用对象.下一步是通过创建成员变量来实例化它.
template <class F>
class A {
F function;
public:
int f(int i) {
return function(i);
}
};
Run Code Online (Sandbox Code Playgroud)
但是,由于删除了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);
Run Code Online (Sandbox Code Playgroud)
这使用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)...);
}
};
Run Code Online (Sandbox Code Playgroud)
如果您确实想使用模板来接受任何类型的函数签名,那么实现应该与此类似:
class A {
public:
template<typename F, typename... Args>
auto f(F&& funct, Args&&... args) {
return funct(std::forward<Args...>(args)...);
}
};
Run Code Online (Sandbox Code Playgroud)
那是因为你在评论中说过:
F问:只有方法的类中才需要类型吗f?
答:只有方法。
因此,当您可以只拥有一个模板方法时,拥有一个模板类应该是没有用的。
这里是一个如何调用仅调用“可调用对象及其参数”的方法的示例,在本例中是 lambda 函数:
int main(int argc, char* argv[]) {
A a;
a.f([](int i) -> int { return i + 5; }, 12);
// |------callable object-----------| |argument of function|
return 0;
}
Run Code Online (Sandbox Code Playgroud)
实际上,该方法f接受“可调用对象”作为第一个参数,并接受为了调用第一个参数而请求的任何参数作为进一步的参数。
如果您想向方法传递f某种类型的函数签名,例如:int (*)(int),那么您可以避免使用模板并传递 类型的对象std::function。
这只是一个例子:
#include <functional>
class A {
public:
// method g accept a function which get a integer and return an integer as well.
int g(std::function<int(int)> funct, int arg) {
return funct(arg);
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
933 次 |
| 最近记录: |