【问题标题】:Type conversion for lambda C++lambda C++ 的类型转换
【发布时间】:2017-09-18 18:06:57
【问题描述】:

是否可以将 lambda 函数作为某种类型的函数传递?

例如,我有

typedef double(*Function)(int, double);

如何将 lambda 函数转换为类型?

【问题讨论】:

标签: c++ function lambda type-conversion


【解决方案1】:

对于无状态 lambda,此转换是隐式可用的:

Function f = [](int, double) -> double {};

如果只想转换 lambda 表达式本身,可以使用一元 + 运算符来实现:

auto* p = +[](int, double) -> double {};   // p is of type double(*)(int, double)

带有捕获的 lambda 不提供此类转换,因为它在语义上不等同于(无状态)函数(这甚至适用于最终不捕获任何内容的默认捕获的情况)。

【讨论】:

  • "一元 + 运算符" 太好了! (如here 所述,地图上仍有白点可供探索)。
  • @user0042 - 很棒。但可悲的是,某个主流编译器,将保持未命名,still chokes on it
  • 请参阅stackoverflow.com/a/17822241/801894 以获得对一元 + 选项的更深入解释。
【解决方案2】:

您可以使用std::function 代替普通函数指针。这将允许保留 lambda,即使它们有捕获:

#include <iostream>
#include <functional>

typedef std::function<double(int, double)> Function;

int main()
{
    Function f;
    int i = 4;
    f = [=](int l, double d){ return i*l*d; };
    std::cout << f(2, 3);
}

[Live Demo]

【讨论】:

    猜你喜欢
    • 2012-02-23
    • 2020-08-17
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2015-06-07
    • 2010-11-23
    相关资源
    最近更新 更多