Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将Lambda表达式转换为函数指针_C++_Visual C++_C++11_Visual Studio 2013_Lambda - Fatal编程技术网

C++ 将Lambda表达式转换为函数指针

C++ 将Lambda表达式转换为函数指针,c++,visual-c++,c++11,visual-studio-2013,lambda,C++,Visual C++,C++11,Visual Studio 2013,Lambda,我正在使用Visual C++2013(但此处似乎没有此标记) 我有一个结构 struct init_param{ bool (*validation)(double**); }; 我想强制转换实例model的成员函数ValidateParameters。所以我尝试使用Lambda表达式: init_params params; params.validation = [&model](double **par){return model.ValidateParameters(

我正在使用Visual C++2013(但此处似乎没有此标记)

我有一个结构

struct init_param{
    bool (*validation)(double**);
};
我想强制转换实例
model
的成员函数
ValidateParameters
。所以我尝试使用Lambda表达式:

init_params params;
params.validation = [&model](double **par){return model.ValidateParameters(par); };
但编译器说:

错误C2440:“=”:“main::” 无法转换为“bool(u cdecl*)(double**)”

如何进行?
或者,更改Lambda表达式工作的
init_param
结构的最简单方法是什么?

您可能只需将
验证更改为std::function对象:

#include <functional>

struct init_param
{
    std::function<bool(double**)> validation;
};
#包括
结构初始化参数
{
功能验证;
};

带有捕获的lambda无法转换为函数指针。您的lambda捕获
型号

C++标准第§5.1.2节[expr.prim.lambda]:

非泛型lambda表达式的闭包类型,没有 lambda capture具有公共的非虚拟非显式常量转换 函数到带有C++语言链接的函数指针

您可以改用
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);
}
使用名称空间std::占位符;
结构初始化参数{
功能验证;
};
结构模型类型
{
bool ValidateParameters(双**par){return false;}
};
int main(){
初始参数;
模型类型模型;
params.validation=std::bind(&modelType::ValidateParameters,&model,_1);
}

使用
std::bind
代替普通Lambda表达式有哪些优点?为什么不使用
std::bind1st
?@quantdev您可以使用lambda。不能使用函数指针。std::bind是c++11,这使得std::bind1st和类似的东西几乎毫无用处。这里并没有真正的优势,只是因为lambda捕获了函数指针,所以不能使用函数指针model@T.C.评论改写,谢谢