当重载operator()不够或者当我需要虚函数或其他东西时,有些情况下我必须选择lambda上的本地类。有没有更好的方式在C++中实现Java类本地类?
嗯..例如:
我需要捕捉局部变量,并拥有一个以上的功能,这些功能,可惜的相同签名的对象。
- 重载lambda可以解决这样的问题,如果功能是不同的签名。我认为这是一个常见的问题,因为有lambda重载技巧。
我需要一个对象捕获局部变量并继承一些其他类或具有成员变量。
- 这是每天在java世界发生的事情。动态多态性至少有时候有用。
我现在正在做什么,是定义一些辅助宏这样的:
#define CAPTURE_VAL(Var) decltype(Var) Var
#define CAPTURE_REF(Var) decltype(Var) &Var
#define INIT_CAPTURE(Var) Var(Var)
并把它们放到本地类:
struct Closure
{
Closure(CAPTURE_VAL(var1), CAPTURE_REF(var2)) : INIT_CAPTURE(var1), INIT_CAPTURE(var2)
{
}
int foo()
{
return some_expression;
}
private:
CAPTURE_VAL(var1);
CAPTURE_REF(var2);
} closure(var1, var2);
这是丑陋的。我不得不引用同一个变量三次。
我得给这个班级一个ctor的名字。
我必须给封闭变量名称,但我认为这不能在当前标准下帮助。
至少在VC++ 11中,lambda捕获的变量是私有的,所以我不能简单地继承lambda类。至少在VC++ 11中,继承lambda类需要lambda的变量(或者其他一些其他占位符),这很丑陋。
我想我甚至不知道如果标准可以让我捕捉到局部变量的局部类这样的类型...
在测试了GCC 4.6,本地变量的类型不能像VC++那样被捕获。捕获的变量不像VC++中那样暴露。 LOL
啊,我的不好。我忘了打开C++ 11。这适用于G ++。但是lambda类型不能被继承,并且捕获的变量仍然没有公开。
不太好...不得不离开-fpermissive。或者G ++认为成员变量与decltype()中使用的局部变量冲突。
我一直在徘徊C++为什么选择了这样一个高层次的拉姆达为封闭的,而不是更通用的本地类,它可以捕捉局部变量。
你想达到什么目的? ** C++ lambda可以捕获* local *变量**。 – Nawaz 2013-04-30 06:27:21
@Nawaz但lambda不能定义operator()以外的成员函数,不能定义成员变量,不能继承基类,因此不能做对象多态。 – BlueWanderer 2013-04-30 06:42:55
再次:你想要*达到*什么?你在这里描述了一些你经常使用的模式(如果没有,那是什么问题?)。由于它不是一种常见的模式,因此您尝试使用它解决的问题可能有另一种更常见的解决方案。所以请解释核心问题,而不是解决该核心问题的问题。 – 2013-04-30 06:53:51