2013-04-30 31 views
3

当重载operator()不够或者当我需要虚函数或其他东西时,有些情况下我必须选择lambda上的本地类。有没有更好的方式在C++中实现Java类本地类?

嗯..例如:

  1. 我需要捕捉局部变量,并拥有一个以上的功能,这些功能,可惜的相同签名的对象。

    • 重载lambda可以解决这样的问题,如果功能是不同的签名。我认为这是一个常见的问题,因为有lambda重载技巧。
  2. 我需要一个对象捕获局部变量并继承一些其他类或具有成员变量。

    • 这是每天在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++为什么选择了这样一个高层次的拉姆达为封闭的,而不是更通用的本地类,它可以捕捉局部变量。

+2

你想达到什么目的? ** C++ lambda可以捕获* local *变量**。 – Nawaz 2013-04-30 06:27:21

+0

@Nawaz但lambda不能定义operator()以外的成员函数,不能定义成员变量,不能继承基类,因此不能做对象多态。 – BlueWanderer 2013-04-30 06:42:55

+1

再次:你想要*达到*什么?你在这里描述了一些你经常使用的模式(如果没有,那是什么问题?)。由于它不是一种常见的模式,因此您尝试使用它解决的问题可能有另一种更常见的解决方案。所以请解释核心问题,而不是解决该核心问题的问题。 – 2013-04-30 06:53:51

回答

0

这将不仅仅是适合您的问题的简单评论,所以我会让它成为一个答案。

确实有些情况下,你想要其他的东西,比简单的函子或lambda更复杂。但是,这些案例是非常不同的和多样化的,没有“一刀切”的解决方案,特别是没有一条适合于几条线,并且不会影响单一功能的范围。
在可读性和简单性方面,在函数内部本地创建复杂行为并不是一个好主意,并且肯定会违反SRP的功能。
在许多情况下,如果您必须编写多个operator(),这意味着您将需要重新使用已编写的代码,如果它位于本地类中,则无法完成此操作。

含义:在大多数情况下,使用合适的构造函数等,编写合适的类,在函数之外编写适当的类是最好的解决方案。

+0

其实我想把类放入函数的唯一原因是为了可读性和简单性。将事物移动到外面会破坏逻辑的连续性,这就是当人们想把事物留在里面的时候。我认为多态性本身并不是单一的责任。 – BlueWanderer 2013-04-30 08:45:27

相关问题