C++ C++;0x是否支持匿名内部类?

C++ C++;0x是否支持匿名内部类?,c++,c++11,C++,C++11,假设我有C++98内置的监听器,它们是抽象的,例如必须实现ActionPerformed。在C++0x中,是否有一种类似于Java的方法: button.addActionListener(new ActionListener() { public void actionPerfored(ActionEvent e) { // do something. } }); 谢谢不,你不能那样做 java C++,11的LAMBDAS非常有用。 < P>这是C++,不是Java,所以编写类似Java

假设我有C++98内置的监听器,它们是抽象的,例如必须实现ActionPerformed。在C++0x中,是否有一种类似于Java的方法:

button.addActionListener(new ActionListener() {
public void actionPerfored(ActionEvent e)
{
// do something.
}
});
谢谢

不,你不能那样做


java C++,11的LAMBDAS非常有用。

< P>这是C++,不是Java,所以编写类似Java的C++将不能很好地工作。 无论如何,您可以创建一个适配器函数。假设

typedef int ActionEvent; // <-- just for testing

class ActionListener
{
public:
    virtual void actionPerformed(const ActionEvent& event) = 0;
};

<>请注意,这与惯用的C++无关,在AdActudiListNeNE.(/Cuff>)中,您应该简单地使用 const STD::函数和,或者模板模板参数,以最大效率地提供lambda。

不完全是,但是您可以用lambda来做一些事情。

i、 e:

类ActionListener
{
公众:
typedef std::函数ActionCallback;
公众:
ActionListener(ActionCallback cb)
:_回调(cb)
{}
无效火灾(ActionEvent&e)
{
_撤回(e);
}
私人:
ActionCallback\u callback;
};
..
addActionListener(新建ActionListener(
[](ActionEvent&e)
{
...
}
));

<代码> > p>我认为我们可以用lambdas< /p>在C++中实现这一点。
button.addActionListener([]()->ActionListener*{ struct A: ActionListener {
void actionPerfored(ActionEvent e)
{
// do something.
}
}; return new A;}());

在宏中很容易把它包起来。问题是我有很多代码,使用java的方式来做,lambdas在这里不能帮助。你不能用java方式来做,所以你必须找到另一种方法,lambda可以帮助你。你有很多C++代码,使用java方法。试图假装C++是java的最佳选择,肯定会让你的生活变得糟糕。一个适当的C++接口当然会有任何这样的“AdActudiListor”,使用一个适当的函数,一个重载<代码>操作器()/<代码>,而不是重写一个虚拟函数,依赖于继承。{return new struct:ActionListener{…};}

。这实际上看起来很像Java版本。。。
#include <iostream>

void addActionListener(std::shared_ptr<ActionListener> listener)
{
    ActionEvent e = 12;
    listener->actionPerformed(e);
}

int main()
{
    addActionListener(make_action_listener([](const ActionEvent& event)
    {
        std::cout << event << std::endl;
    }));
}
class ActionListener
{
public:
   typedef std::function<void(ActionEvent&)> ActionCallback;

public:
   ActionListener( ActionCallback cb )
      :_callback(cb)
   {}

   void fire(ActionEvent& e )
   {
      _callback(e);
   }

private:
   ActionCallback _callback;
};


..
button.addActionListener( new ActionListener(
   []( ActionEvent& e )
   {
       ...
   }
));
button.addActionListener([]()->ActionListener*{ struct A: ActionListener {
void actionPerfored(ActionEvent e)
{
// do something.
}
}; return new A;}());