我可以在类中有一个命名的 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<<"showbits called "<<endl;
完全等同于所讨论的 lambda。即使auto
的用法有效,或者如果 lambda 类型的工作方式不同,也没有理由在常规函数可以正常工作时使用 lambda。以上是关于我可以在类中有一个命名的 lambda 函数作为变量并尝试从主函数调用命名的 lambda 吗?的主要内容,如果未能解决你的问题,请参考以下文章