Lambdas vs函数+ UI事件的函数指针

时间:2013-05-17 18:29:03

标签: c++11 lambda

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

所以这就是我一直在做的事情:

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_Click()函数。

除此之外,这里有更好的设计吗? Lambda或全局函数是编辑器类的朋友?我忽视了一个或另一个有明显的负面属性吗?

1 个答案:

答案 0 :(得分:4)

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

例如,

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

class Button {
    // stuff...

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

    // stuff...
};

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