【问题标题】:Convert Lambda expression to function pointer [duplicate]将 Lambda 表达式转换为函数指针 [重复]
【发布时间】:2015-03-31 12:50:28
【问题描述】:

我使用的是 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 (__cdecl *)(double **)'

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      带有捕获的 lambda 不能转换为函数指针。您的 lambda 捕获 model

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

      非泛型 lambda 表达式的闭包类型 没有 lambda-capture 具有公共的非虚拟非显式 const 转换 函数指向与 C++ 语言链接的函数的指针

      您可以改用std::function&lt;&gt;

      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::bind代替普通的Lambda表达式有什么好处?为什么不使用std::bind1st
      • @quantdev 您可以使用 lambda。你不能使用函数指针。
      • std::bind 是 c++11 并使 std::bind1st 等几乎没用。这里没有真正的优势,只是你不能使用函数指针,因为你的 lambda 捕获模型
      • @T.C.评论改写,谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 2018-10-29
      • 2018-06-15
      • 2019-09-12
      相关资源
      最近更新 更多