2014-12-09 1 views
2

그래서,이 고급 C++ 프로그래머들에게 아주 간단한 질문입니다 생각,하지만 난 하나도 해요 : C++ 사용 11enum을 키로 사용하고 다양한 시그니처를 값으로 사용하여 std :: map을 선언하는 방법은 무엇입니까?

은, 우아한 방법 무엇 키로 범위 enum를 사용하는 std::map을 구현하는 그리고 값으로 변화하는 서명이 수학 함수를 취합니다

간단한 예 - 모든 숫자 유형 또는 함수 인수의 수 수 있지만이 내 사용 사례에 대한 전형적인 수 :

enum class FUNCS 
    { 
     DOUBLE_FUNC1, DOUBLE_FUNC2, INT_FUNC3, INT_FUNC4 
    }; 

일부를 functi 기능 :

mMAP[FUNCS::DOUBLE_FUNC1]=f1; 
mMAP[FUNCS::DOUBLE_FUNC2]=f2; 
mMAP[FUNCS::INT_FUNC3]=f3; 
mMAP[FUNCS::INT_FUNC4]=f4; 

사용지도 :

mMAP[FUNCS::DOUBLE_FUNC1](a,b,d); 
mMAP[FUNCS::INT_FUNC3](a,d,c,e); 

지도를 초기화 :

double f1(int a, int b, double d); 
double f2(int a, int b, int c, int d); 
int f3(int a, double d, int c, double e); 
int f4(int a, double d, int c); 

내가 추구하는 기능은 다음과 같이 작동하는 표준 : :지도입니다 일부 유형 변환과 관련된 절충안에는 함수를 사용할 수 있습니다.

double f1(int a, int b, double d); 
double f2(int a, int b, int c, int d); 
double f3(int a, double d, int c, double e); 
double f4(int a, double d, int c); 

어떻게 나에게이 기능을 제공하는지도를 선언 할 수 있습니다 : 모든 double을 반환 인수를 변화와? 나는 아마도 그 키들에 그 함수들을 직접적으로 매핑 할 수 없다는 것을 이해한다 - 나는이 목표를 달성하기 위해 일종의 추상화/간접 접근법을 필요로한다. 그리고 나는 가변성 함수/템플릿을 사용하여 수행 할 수 있다고 생각한다. Variadic argumentsParameter pack을 보라. 이 작업을 수행하는 방법에 대해서는 명확하지 않습니다.

그 사이에 나는 std::tuple에 가능한 모든 유형의 값을 포함하는 함수 포인터 유형을 사용하여 결과에 대한 참조와 함께 인수를 작성한 다음 매핑 된 각 fuction에서 적절한 구성원을 사용합니다 튜플의 지저분한!

여기 내 목표 유형 boost::any의 데이터를 사용하여 차트는 GUI 기반 상태 기계는 표현 열거 값을 기준으로지도를 통해 해당 함수를 호출 생성하는 차트 라이브러리에 이러한 다양한 기능에서 데이터를 전송하는 것입니다 상태 머신에서 실행하고 해당 기능의 데이터를 기반으로 차트를 생성합니다.

+0

각 'FUNCS'값은 단일 고유 함수 유형에 해당합니까? –

+0

@ T.C. - 아뇨. 그랬다면 의심의 여지가 없어! 읽어주세요. :) – Vector

+0

즉,'mMAP [FUNCS :: DOUBLE_FUNC1] = f2;'라고 쓸 수 있을까요? –

답변

2

C++는 정적으로 입력 된 언어입니다.

struct F1Data { double result; int a; int b; double d; }; 
struct F2Data { double result; int a, b, c, d; }; 
struct F3Data { int result; int a, b; double c; }; 
struct F4Data { int result; double a, b; int c; }; 

void f1(void* data); 
void f2(void* data); 
void f3(void* data); 
void f4(void* data); 

그런 다음 각 함수 내에서, 당신이 바로 그 유형에 data을 캐스팅 작업 할 수 있습니다 : 당신이 할 수있는

수있는 유일한 방법은 기능은 예를 들어, 일반적인 서명을 사용하는 모든해야하는 것 거기 값.

당신이 얻을 수있는만큼 가깝습니다. tuple 또는 any과 같은 라이브러리를 사용하여 마스크 할 수 있지만 모든 기능에서 공유 서명을 만드는 데 항상 부셔집니다.

+0

[** Variadic arguments **] (http://en.cppreference.com/w/cpp/language/variadic_arguments) 및/또는 [** Parameter pack **] (http : //en.cppreference .com/w/cpp/language/parameter_pack)? – Vector

+0

가변 인수는 그것을 할 것이지만 나의 제안보다 훨씬 덜 깨끗합니다. 매개 변수 팩은 함수의 형식에 영향을 미치며 작업하기가 더 어려워 질 것입니다. – StilesCrisis

+0

저는 스위치를 사용하려고 할 것입니다. 그러나이 모든 것이 아마도 내가 생각하는 것을 성취하는 가장 단순하고 청결한 방법이라고 생각할 것입니다. 그래서이 대답을 받아 들일 것입니다. – Vector

1

모든 기능이 서로 다른 서명을 가지고 있기 때문에 불가능합니다.

모든 기능이 서로 다른 유형이므로 어떤 종류의 유형 삭제도 사용할 수 없습니다.

+0

모든 인수 유형을 하나의 하이브리드 유형으로 축소하는 절충을 통해서만 수행 할 수 있습니다. C++은 정적으로 타입 된 언어입니다. – StilesCrisis

+0

나는 이것이 불가능하다고 확신하지 않는다. 편집 : [** Variadic arguments **] (http://en.cppreference.com/w/cpp/language/variadic_arguments) 및 [** Parameter pack **] (http://en.cppreference.com/ w/cpp/language/parameter_pack) – Vector

+0

@Vector 가변 인수를 사용하여 재 설계하는 것이 좋습니다. 사실, 말한 것처럼 [here] (http://stackoverflow.com/a/27386465/476681), 당신은 타입 지우기를 사용할 수 있습니다. 그런 다음 반환 값을 구조체에 넣어야합니다. –

관련 문제