我可以在类中有一个命名的 lambda 函数作为变量并尝试从主函数调用命名的 lambda 吗?

Posted

技术标签:

【中文标题】我可以在类中有一个命名的 lambda 函数作为变量并尝试从主函数调用命名的 lambda 吗?【英文标题】:Can I have a named lambda function as variable inside a class and try to call the named lambda from main function? 【发布时间】:2020-05-09 08:50:45 【问题描述】:
#include <iostream>
using namespace std;

class convert

    public :
        int n;

        convert( int number)
        
            n = number;     
        
        auto showbits() =[]()
            cout<<"showbits called "<<endl; 
        ;

;

int main() 
    convert c(10);
    auto val = c.showbits();
    return 0;

1.我收到以下错误 错误:在“]”标记之前无效的纯说明符(只允许“= 0”)

【问题讨论】:

showbits 后面的括号过多(但这还不足以让它正常工作) 【参考方案1】:

您不能将 lambda 作为成员,因为 lambda 是“奇怪的”对象,您只能使用 auto 声明它们(无法拼写 lambda 表达式的类型),但是 auto 非静态成员是不允许。

没有真正的理由,除了他们决定这样做(正式原因有很多,但它们中的每一个也适用于 auto 的其他用途,而是允许的,所以 IMO 他们不是解释) .

当其他人加入委员会时,可能会发生一些变化。

您可以通过为成员使用 std::function 包装器来规避此问题。

struct Foo 
    std::function<double(double)> square = [](double x)  return x*x; ;
;

【讨论】:

或者您可以将其设为静态成员,因为基本上没有理由使用类范围的 lambda。它无法捕获this 或成员变量,因此它实际上只是编写静态成员函数的一种不必要的冗长方式。 @NicolBolas:为什么每个实例都有一个 lambda 成员对您来说没有意义?它就像一个函数指针,但它更好,因为它可以有状态。不幸的是,在 C++ 实现中,lambda 类型与主体相关联,而不是与接口相关联(这使得它们的用处远不如其他语言),但将它们包装在 std::function 中可以解决部分问题。 "更好,因为它可以有状态" 1)他的例子没有状态。 2) 所述 lambda 的任何状态都可以在对象本身中,因此对于阅读代码的人来说具有名称和逻辑含义,以及必要时的适当复制/移动行为。 3)如果它没有状态,那么它会不必要地占用对象中的空间。 @NicolBolas:C++ lambda 确实很弱,因为类型与实现主体而非接口相关联。在大多数情况下,将它们包裹在 std::function 对象中是强制性的(即使这样也不是没有问题,因为 std::function 有点“隐藏”签名,这会产生问题,例如重载解析)。 你似乎没有抓住重点。 lambdas 是否“绑定到实现主体而不是接口”是无关紧要的,因为对于所有有用的目的,static void showbits() cout&lt;&lt;"showbits called "&lt;&lt;endl; 完全等同于所讨论的 lambda。即使auto 的用法有效,或者如果 lambda 类型的工作方式不同,也没有理由在常规函数可以正常工作时使用 lambda。

以上是关于我可以在类中有一个命名的 lambda 函数作为变量并尝试从主函数调用命名的 lambda 吗?的主要内容,如果未能解决你的问题,请参考以下文章

在类中访问向量

如何在类中有函数指针?

在类中使用导入

在类中调用另一个构造函数作为全局[关闭]

几种方法的 BDD 命名

命名空间在类中找到,但在 aspx 中没有