2013-11-28 4 views
0

C++의 함수에 대해 (저에게) 어려운 문제가 있습니다. 저는 Numbers, Characters와 같은 클래스를 만들었습니다. 각 클래스는 void add 함수를 가지고 있지만 숫자는 void add(int v), 문자 - void add(char c) 등입니다. 주 함수에서 Numbers 및 다른 클래스의 인스턴스 (numbs, charcts)가 있는데이를 std와 바인딩하려고합니다. :지도는, 그래서 그런 식으로 함수를 호출 할 수 있습니다 :매개 변수 형식을 지정하지 않고 함수 바인딩

func_map["numbers"]["add"](12); 

같은 일 것이다 :

numbs.add(12); 

하지만하여 메서드를 호출 할 수 있다면, 나를 위해 쉬울 것이다 그들의 이름을 문자열로 지정합니다 (위의 그림 참조). 어떻게해야합니까?

+0

다른 언어, JavaScript 또는 다른 것을 사용하면 더 행복하다고 생각합니다. C++에서 작동하도록 할 수는 없지만 실제로 언어와 싸우는 것은 아닙니다. – john

+0

그게 더 쉬울까요? 전화를 걸거나 나를 읽는 것이 더 어려워 보입니다 ... –

+0

@BitFiddlingCodeMonkey 나중에 전화하기가 더 쉽습니다. 사용자는 "numbers add 2"를 입력 할 수 있으며 많은 코딩으로 사용자의 입력을 구문 분석 할 필요가 없습니다. –

답변

1

나는 그런 디자인에 대해 경고합니다.

하지만, 절대적으로 필요하다면 함수에 대한 공통 인터페이스를 정의해야합니다. 즉, 함수의 프로토 타입이 동일해야합니다.

예를 들어, 다른 데이터 유형으로 구성 할 수있는 컨테이너 클래스를 정의하거나 boost :: variant와 같은 것을 사용할 수 있습니다.이 클래스의 객체를 허용하도록 '추가'함수를 작성할 수 있습니다. 무슨 말인지 :

class DataContainer { 
public: 
    DataContainer(int n) { int_data_ = n; } 
    DataContainer(char c) { int_data_ = c; } 
    DataContainer(const string s) { string_data_ = s; } 
// let them be public to make code shorter 
    int int_data_; 
    string string_data_; 
}; 

typedef void (*OpMethod)(const DataContainer); 

void NumberAdd(const DataContainer data) { 
    // work with data.int_data_ 
} 

map<string, map<string, OpMethod> > funcmap; 

... 
    funcmap["number"]["add"] = NumberAdd; 

바인딩 클래스 방법은 좀 더 어려울 것입니다 (개체 인스턴스도 지정해야합니다). std :: function 사용을 고려하십시오.

관련 문제