2013-05-17 4 views
0

나는 내장 게임 편집기가 포함 된 게임 엔진을 가지고 있습니다. 편집기는 게임 내 편집기가 호출 될 때 인스턴스화되는 단일 객체로만 사용되는 자체 클래스입니다. 나는 또한 편집기와 별도로 (꽤) 완전한 UI 시스템을 가지고있다 (게임에서도 사용된다). 편집기에는 편집기 클래스에서 함수를 호출하는 버튼과 같은 UI 요소가 있지만 UI 시스템은 다른 비 편집기 항목에도 사용됩니다. 따라서 버튼이 에디터 클래스에없는 에디터 함수 및 다른 것들에 액세스하려면 클래스 메소드 포인터가 아닌 함수 포인터를 사용해야합니다. 이 함수는 적절한 편집기 -> Method()를 호출합니다.Lambdas 대 UI 이벤트를위한 함수 포인터 + 함수 포인터

void MyButton_Click(void) { if (editor) editor->AppropriateMethod(); }; 
Button some_button("Button Label", &MyButton_Click); 

난 그냥 C++ 11 람다에 대해 알게 내 버튼을 인스턴스화 할 때 내가 대신 람다를 사용하는 경우 내가 모든 전역 함수 제거 할 수 실현 :

그래서 이것은 내가하고 있었던 것입니다 예 :

그러나 오늘 전에 람다를 사용한 적이 없기 때문에 나는 이것이 심지어 좋은 생각인지 알고 싶습니다. 같은 에디터 함수를 호출하기 위해 하나 이상의 버튼이 필요하지 않는 한, 코드를 어디서나 (람다) 복사하지 않을 것이라고 생각합니다. 필자가 필요하다면, 내가했던 것처럼 전역 EditorFunction_Click() 함수를 선언 할 것입니다.

그럼 그 외의 더 나은 디자인은 무엇일까요? 편집기 클래스에 친구가되는 람다 또는 전역 함수? 내가 간과하고있는 하나 또는 다른 것에 대해 눈부신 부정적 속성이 있습니까?

+0

죄송합니다. 게시물을 게시 한 후 몇 초 후에 질문을 편집해야했습니다. – Brandon

답변

4

std::function을 사용하지 않고 사용자가 람다, 함수 포인터, 함수 객체 등을 사용할 지 결정할 수있게 해주는 이유는 무엇입니까? 약간의 오버 헤드가 추가되지만 많은 유연성을 제공합니다. 예를 들어

,

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

class Button { 
    // stuff... 

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

    // stuff... 
}; 

그런 다음 당신은 최대한의 유연성을 위해, C에서 호출 가능한 객체를 ++ 사용하는 버튼을 만들 수 있습니다. 함수처럼 보이면 사용할 수 있습니다.

+0

UI 시스템의 경우 이러한 것들이 클릭시에만 발생하기 때문에 성능에 대해 걱정하지 않아도됩니다. 그러나 나는 실행 파일의 크기를 늘리는 것에 대해 걱정하고 있습니다. 나는 std : function이 그것을 할 것인지, 나는 그것을 사용한 적이 없다는 것을 알지 못하지만, 꽤 멋지게 들린다. – Brandon

+1

그럼 std :: function을 사용해도됩니다. 두건 아래에 가상 함수 호출을 사용하여 일부 유형 지우기 마법을 수행하지만 영향을 미치지는 않습니다. – bstamour