我正在使用Visual Studio 2015。 我的问题是,当我运行它时,它编译并运行没有问题:
typedef double Fct(double);
struct Function {
Function(Fct f) { cout << f(1) << endl; };
};
double double_func(double x, double n) { return x + n; }
int main() {
for(int n = 0; n < 50; ++n)
Function e{ [](double x) { return double_func(x,1); } }
}
问题是我想要这个部分:
Function e{ [](double x) { return double_func(x,1); } }
要有这样的捕获参数:
typedef double Fct(double);
struct Function {
Function(Fct f) {};
};
double double_func(double x, double n) { return x + n; }
int main() {
for(int n = 0; n < 50; ++n)
Function e{ [n](double x) { return double_func(x,n); } }
}
但是我收到了这个错误:no instance of constructor "Function::Function" matches the argument list argument types are: (lambda []double (double x)->double)
答案 0 :(得分:1)
lambda表达式可以作为函数指针处理,只要它不捕获任何东西。
auto lambda = [](int x, int z) {
return x + z;
};
int(*ptr)(int, int)const = &decltype(lambda)::operator();
std::cout << "test = " << (lambda.*ptr)(2, 3) << std::endl;
但lambdas实际上更像是一个实现了operator()的类。 如果要保存捕获的一个,则必须将其存储为对象函数指针:
int first = 5;
auto lambda = [=](int x, int z) {
return x + z + first;
};
int(decltype(lambda)::*ptr)(int, int)const = &decltype(lambda)::operator();
std::cout << "test = " << (lambda.*ptr)(2, 3) << std::endl;
如果要返回此功能并从其他地方执行。 (这实际上可以使用lambdas)你必须保存对象:
// OT => Object Type
// RT => Return Type
// A ... => Arguments
template<typename OT, typename RT, typename ... A>
struct lambda_expression {
OT _object;
RT(OT::*_function)(A...)const;
lambda_expression(const OT & object)
: _object(object), _function(&decltype(_object)::operator()) {}
RT operator() (A ... args) const {
return (_object.*_function)(args...);
}
};
auto capture_lambda() {
int first = 5;
auto lambda = [=](int x, int z) {
return x + z + first;
};
return lambda_expression<decltype(lambda), int, int, int>(lambda);
}
答案 1 :(得分:0)
Fct
不是你试图通过的lambda的超级类型。 (大概是因为函数指针比这种lambda占用更少的存储空间)你可能希望使用std::function<...>
作为Fct
的类型,而不是typedef&#d; d函数指针。