2013-05-16 3 views
0

나는 내 친구와 함께 일하는 게임을위한 간단한 개발자 콘솔을 만들고 있습니다. 콘솔에 함수를 바인딩하는 중이므로 콘솔에서 호출 할 이름을 포함하는 문자열을 포함하는 std :: map과이 인터페이스를 반환하는 함수 포인터 인 자체 정의 된 MFP 유형이 있습니다. sf :: String (SFML을 사용하고 sf는 SFML 네임 스페이스 임) sf :: String을 매개 변수로 사용합니다. 모든 콘솔 함수는 sf :: String을 사용하고 sf :: String을 반환합니다.지정되지 않은 네임 스페이스의 함수 포인터 정의

#include <SFML/System/String.hpp> 
using namespace sf; 

#include <map> 
#include <string> 
using namespace std; 

class CConsole 
{ 
public: 
    typedef sf::String (*MFP)(sf::String value); //function pointer type 

    void bindFunction(string name, MFP func); //binds a function 
    void unbindFunction(string name); //unbinds desired function 
private: 
    map <string, MFP> functions; 
} 

지금이 너무 오래 우리는 콘솔에 결합하려는 기능의있는 모든 벌금과 멋쟁이 : 여기

는 (모든 코드가 아닙니다) 같은 문제의 코드가 어떻게 표시되는지를 보여줍니다 글로벌 네임 스페이스. 그러나 이것은하지 않을 것입니다. 콘솔에 바인드하려는 모든 중첩 함수에 대해 전역 래퍼 함수를 ​​지속적으로 만드는 것은 너무 비효율적입니다.

'MFP'가 모든 네임 스페이스의 함수 포인터를 허용 할 수 있습니까? 예를 들어 휴면 코드가 완벽하게 작동하도록하려면?

#include "console.h" //code shown above 

//Let's also pretend CConsole has an sf::String(sf::String value) method called consoleFunc that returns "Hello from the CConsole namespace!" 

sf::String globalFunc(sf::String value) 
{ 
    return "Hello from the global namespace!"; 
} 

int main() 
{ 
    CConsole console; 
    console->bindFunction("global", globalFunc); 
    console->bindFunction("CConsole", CConsole::consoleFunc); 
    return 0; 
} 
+0

std :: function을 사용합니다. – Jiwan

+1

모든 자유 함수는 올바른 서명이있는 한 MFP 유형의 함수 포인터도 바인딩 할 수 있습니다. [this] (http://coliru.stacked-crooked.com/view?id=e1a7907a2c4ab2fb7862f5f94afad68a-d77f64e4484f751719e92fe5e8b5b11c)를 참조하십시오. 네임 스페이스가 어떤 식 으로든 당신을 방해하지 않습니다. 어쩌면 네임 스페이스와 클래스 범위를 혼란스럽게 만들 수 있습니다. 멤버 함수를 일반 함수 포인터에 바인딩 할 수 없다는 것은 사실입니다. – jrok

+0

맞습니다. 나는 클래스 스코프와 네임 스페이스를 혼란스럽게 생각합니다. bindFunction()을 클래스 메소드와 함께 사용하려면 어떻게해야합니까? – user2245854

답변

0

예제에서 비회원 함수 또는 모든 클래스의 정적 멤버 함수에 bindFunction을 호출 할 수 있습니다. 다른 유형이 있으므로 비 정적 구성원으로 bindFunction을 사용할 수 없습니다.

관련 문제