将 Lambda 表达式转换为函数指针
Convert Lambda expression to function pointer
我用的是Visual-C++ 2013(不过这里好像没有这个标签)
我有一个结构
struct init_param{
bool (*validation)(double**);
};
我想转换实例 model
的成员函数 ValidateParameters
。所以我尝试使用 Lambda 表达式:
init_params params;
params.validation = [&model](double **par){return model.ValidateParameters(par); };
但是编译器说:
error C2440: '=': 'main::< lambda_d8b99bf9b28e45558a48b7e9148b3202>'
can not be converted into 'bool (__cdecl *)(double **)'
如何进行?
或者更改 init_param
结构的最简单方法是什么,hte Lambda 表达式可以工作?
您可以将 validation
更改为 std::function 对象:
#include <functional>
struct init_param
{
std::function<bool(double**)> validation;
};
带捕获的 lambda 不能转换为函数指针。您的 lambda 捕获 model
.
C++ 标准部分 § 5.1.2 [expr.prim.lambda] :
The closure type for a non-generic lambda-expression with no
lambda-capture has a public non-virtual non- explicit const conversion
function to pointer to function with C ++ language linkage
您可以使用 std::function<>
代替:
using namespace std::placeholders;
struct init_params{
std::function<bool(double**)> validation;
};
struct modelType
{
bool ValidateParameters(double** par) { return false; }
};
int main () {
init_params params;
modelType model;
params.validation = std::bind(&modelType::ValidateParameters, &model, _1);
}
我用的是Visual-C++ 2013(不过这里好像没有这个标签)
我有一个结构
struct init_param{
bool (*validation)(double**);
};
我想转换实例 model
的成员函数 ValidateParameters
。所以我尝试使用 Lambda 表达式:
init_params params;
params.validation = [&model](double **par){return model.ValidateParameters(par); };
但是编译器说:
error C2440: '=': 'main::< lambda_d8b99bf9b28e45558a48b7e9148b3202>' can not be converted into 'bool (__cdecl *)(double **)'
如何进行?
或者更改 init_param
结构的最简单方法是什么,hte Lambda 表达式可以工作?
您可以将 validation
更改为 std::function 对象:
#include <functional>
struct init_param
{
std::function<bool(double**)> validation;
};
带捕获的 lambda 不能转换为函数指针。您的 lambda 捕获 model
.
C++ 标准部分 § 5.1.2 [expr.prim.lambda] :
The closure type for a non-generic lambda-expression with no lambda-capture has a public non-virtual non- explicit const conversion function to pointer to function with C ++ language linkage
您可以使用 std::function<>
代替:
using namespace std::placeholders;
struct init_params{
std::function<bool(double**)> validation;
};
struct modelType
{
bool ValidateParameters(double** par) { return false; }
};
int main () {
init_params params;
modelType model;
params.validation = std::bind(&modelType::ValidateParameters, &model, _1);
}