나는 내 친구와 함께 일하는 게임을위한 간단한 개발자 콘솔을 만들고 있습니다. 콘솔에 함수를 바인딩하는 중이므로 콘솔에서 호출 할 이름을 포함하는 문자열을 포함하는 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;
}
std :: function을 사용합니다. – Jiwan
모든 자유 함수는 올바른 서명이있는 한 MFP 유형의 함수 포인터도 바인딩 할 수 있습니다. [this] (http://coliru.stacked-crooked.com/view?id=e1a7907a2c4ab2fb7862f5f94afad68a-d77f64e4484f751719e92fe5e8b5b11c)를 참조하십시오. 네임 스페이스가 어떤 식 으로든 당신을 방해하지 않습니다. 어쩌면 네임 스페이스와 클래스 범위를 혼란스럽게 만들 수 있습니다. 멤버 함수를 일반 함수 포인터에 바인딩 할 수 없다는 것은 사실입니다. – jrok
맞습니다. 나는 클래스 스코프와 네임 스페이스를 혼란스럽게 생각합니다. bindFunction()을 클래스 메소드와 함께 사용하려면 어떻게해야합니까? – user2245854