使用 lambda 作为 C++ 函数的参数

Posted

技术标签:

【中文标题】使用 lambda 作为 C++ 函数的参数【英文标题】:Use a lambda as a parameter for a C++ function [duplicate] 【发布时间】:2017-04-12 04:39:40 【问题描述】:

我想,但我不知道在函数声明中指定哪种类型。我想做的是:

void myFunction(WhatToPutHere lambda)
    //some things

我尝试过void myFunction(auto lambda)void myFunction(void lambda),但这些代码都没有编译。万一这很重要,lambda 不会返回任何内容。

如何在 C++ 函数中使用 lambda 作为参数?

【问题讨论】:

使用std::function<> 参数。 半骗子:***.com/questions/28746744/…。试图找到一个更好的。 【参考方案1】:

你有两种方法:制作你的函数模板:

template <typename F>
void myFunction(F&& lambda)

    //some things

或擦除类型(例如std::function):

void
myFunction(const std::function<void()/*type of your lamdba::operator()*/>& f)

    //some things

【讨论】:

请注意,前者会为您在整个程序中传递给它的每个不同的 lambda 生成一个新的函数克隆,并且不能轻易地用于(可能根本不是)您想要的函数在单独的编译单元中定义。 请注意,第二种解决方案会产生相当多的运行时开销,并且会进行动态分配。因为第一个解决方案就像你将内容放在myFunction内的lambda上一样快 第一个版本应该如何在单独的文件(cpp)中实现该功能? @X.Arthur:你不能。 @Jarod42 你的意思是我不能像普通类型一样在 cpp 文件中进行显式实例化?【参考方案2】:

基本上你有两个选择。

将其设为模板:

template<typename T>
void myFunction(T&& lambda)

或者,如果您不想(或不能)这样做,您可以使用类型擦除的std::function

void myFunction(std::function<void()> const& lambda)


相反,您对auto 的尝试在当前gcc 中实现的TS 概念下是正确的,它是abbreviated template。

// hypothetical C++2x code
void myFunction(auto&& lambda)

或者有一个概念:

// hypothetical C++2x code
void myFunction(Callable&& lambda)

【讨论】:

【参考方案3】:

如果这是一个inline 函数,则首选模板,如

template<typename Func>
void myFunction(Func const&lambda)

    //some things

因为它绑定到任何有意义的东西(并且会导致编译器错误),包括 lambda、命名类的实例和 std::function&lt;&gt; 对象。

另一方面,如果该函数不是inline,即在某个编译单元中实现,则不能使用泛型模板,必须使用指定类型,最好取一个std::function&lt;&gt;对象并通过引用传递.

【讨论】:

【参考方案4】:

像传递一个简单的函数一样传递它。只需使用auto 命名即可

#include <iostream>

int SimpleFunc(int x)  return x + 100; 
int UsingFunc(int x, int(*ptr)(int))  return ptr(x); 
auto lambda = [](int jo)  return jo + 10; ;

int main() 
    std::cout << "Simple function passed by a pointer: " << UsingFunc(5, SimpleFunc) << std::endl;
    std::cout << "Lambda function passed by a pointer: " << UsingFunc(5, lambda) << std::endl;


输出:指针传递的简单函数:105 由指针传递的 Lambda 函数:15

【讨论】:

以上是关于使用 lambda 作为 C++ 函数的参数的主要内容,如果未能解决你的问题,请参考以下文章

如何将 lambda 表达式作为参数传递给 c++ 模板

c++回调函数详解及实现(lambda)

C++细节满满地lambda表达式讲解!

C++细节满满地lambda表达式讲解!

C++ Primer学习笔记

C++中函数参数以及Lambda 函数与表达式