C++11 Lambdas vs functions+;UI事件的函数指针

C++11 Lambdas vs functions+;UI事件的函数指针,c++11,lambda,C++11,Lambda,我有一个游戏引擎,其中包括一个内置的游戏编辑器。编辑器是它自己的类,仅用作单个对象,在调用游戏内编辑器时实例化。我也有一个(相当)完整的UI系统,独立于编辑器(也将在游戏中使用)。编辑器有UI元素,比如调用编辑器类函数的按钮,但UI系统也将用于其他非编辑器的事情。因此,为了让按钮访问编辑器函数和其他不在编辑器类中的东西,我必须使用函数指针,而不是类方法指针。然后,该函数调用相应的编辑器->方法() 这就是我一直在做的: void MyButton_Click( void ) { if ( edi

我有一个游戏引擎,其中包括一个内置的游戏编辑器。编辑器是它自己的类,仅用作单个对象,在调用游戏内编辑器时实例化。我也有一个(相当)完整的UI系统,独立于编辑器(也将在游戏中使用)。编辑器有UI元素,比如调用编辑器类函数的按钮,但UI系统也将用于其他非编辑器的事情。因此,为了让按钮访问编辑器函数和其他不在编辑器类中的东西,我必须使用函数指针,而不是类方法指针。然后,该函数调用相应的编辑器->方法()

这就是我一直在做的:

void MyButton_Click( void ) { if ( editor ) editor->AppropriateMethod(); };
Button some_button( "Button Label", &MyButton_Click );
我刚刚在C++11中了解了lambdas,并意识到如果在实例化按钮时使用lambdas,我可以摆脱所有这些全局函数,如:

Button some_button( "Button Label", []() { if ( editor ) editor->AppropriateMethod(); } );
然而,因为我在今天之前从未使用过lambdas,我想知道这是否是一个好主意。我认为只要我不需要一个以上的按钮来调用同一个编辑器函数,我就不会在任何地方复制代码(lambda)。如果需要的话,我只需要像以前一样声明一个全局EditorFunction\u Click()函数

除此之外,还有什么更好的设计?编辑器类的朋友是lambda还是全局函数?我忽略了其中一个是否有明显的负面属性?

为什么不使用并允许用户决定是否使用lambda、函数指针、函数对象等?它增加了一点开销,但允许很大的灵活性

比如说,

typedef std::function<void (void)> handler_func;

class Button {
    // stuff...

    Button(std::string label, handler_func func);

    // stuff...
};
typedef std::函数处理程序\u func;
类按钮{
//东西。。。
按钮(std::字符串标签,handler_func func);
//东西。。。
};

然后,您可以创建一个按钮,它使用C++中的任何可调用对象,以达到最大的灵活性。如果它看起来像一个函数,您可以使用它。

为什么不使用并允许用户决定是否使用lambda、函数指针、函数对象等?它增加了一点开销,但允许很大的灵活性

比如说,

typedef std::function<void (void)> handler_func;

class Button {
    // stuff...

    Button(std::string label, handler_func func);

    // stuff...
};
typedef std::函数处理程序\u func;
类按钮{
//东西。。。
按钮(std::字符串标签,handler_func func);
//东西。。。
};

然后,您可以创建一个按钮,它使用C++中的任何可调用对象,以达到最大的灵活性。如果它看起来像一个函数,你可以使用它。

抱歉,我必须在发布几秒钟后对我的问题进行显著编辑。抱歉,我必须在发布几秒钟后对我的问题进行显著编辑。对于UI系统,我不关心性能,因为这些事情只会在单击后发生。然而,我担心我的可执行文件的大小过大。我不知道std:function是否能做到这一点,我从未使用过它,但它听起来确实非常漂亮。那么您可以使用std::function。它在引擎盖下使用一个虚拟函数调用来执行一些类型擦除魔术,但它不会影响您。对于UI系统,我不关心性能,因为这些事情只在单击时发生。然而,我担心我的可执行文件的大小过大。我不知道std:function是否能做到这一点,我从未使用过它,但它听起来确实非常漂亮。那么您可以使用std::function。它在引擎盖下使用虚拟函数调用来执行某种类型的擦除魔术,但不会影响您。