0

我有一个游戏引擎,其中包括一个内置的游戏内编辑器。编辑器是它自己的类,仅用作在调用游戏内编辑器时被实例化的单个对象。我还有一个(相当)完整的 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(); } );

但是,由于我在今天之前从未使用过 lambda,所以我想知道这是否是一个好主意。我认为只要我不需要多个按钮来调用同一个编辑器函数,我就不会在任何地方复制代码(lambda)。如果需要,我只需像我一直在做的那样声明一个全局 EditorFunction_Click() 函数。

那么除此之外,这里有什么更好的设计?Lambda 或全局函数是编辑器类的朋友?关于我忽略的一个或另一个,是否有任何明显的负面属性?

4

1 回答 1

4

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

例如,

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

class Button {
    // stuff...

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

    // stuff...
};

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

于 2013-05-17T18:45:23.487 回答