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

时间:2015-02-01 13:16:53

标签: c++ visual-c++ c++11 visual-studio-2013 lambda

我正在使用Visual-C ++ 2013(但这个标签似乎在这里不可用)。

我有一个结构

struct init_param{
    bool (*validation)(double**);
};

我想要转换实例ValidateParameters的成员函数model。所以我尝试使用Lambda Expression:

init_params params;
params.validation = [&model](double **par){return model.ValidateParameters(par); };

但是编译器说:

  

错误C2440:'=':'main ::< lambda_d8b99bf9b28e45558a48b7e9148b3202>”   无法转换为'bool(__ cdecl *)(double **)'

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

2 个答案:

答案 0 :(得分:2)

您可以将validation更改为std :: function对象:

#include <functional>

struct init_param
{
    std::function<bool(double**)> validation;
};

答案 1 :(得分:1)

带捕获的lambda无法转换为函数指针。你的lambda捕获model

C ++标准部分§5.1.2[expr.prim.lambda]:

  

非泛型lambda表达式的闭包类型,没有   lambda-capture 具有公共非虚拟非显式const转换   使用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);
}