2013-05-15 1 views
2

여기 내 코드입니다.매개 변수가 필요한 함수를 호출하는 맵 키 호출 - 작동 방법

#include <map> 
#include <string> 
#include <algorithm> 

class maptest { 
public: 
    int doubler(int val) { return val * 2; } 
    int halver(int val) { return val/2; } 
    int negativer(int val) { return val > 0 ? -val : val; } 
}; 


int main() { 

    const char* const ID[] = {"doubler", "halver", "negativer" }; 
    int ID_SIZE = sizeof(ID)/sizeof(*ID); 

    //signature of maths functions 
    typedef int (maptest::*mathfunc)(int); 


    mathfunc mfuncs[] = { &maptest::doubler, &maptest::halver, &maptest::negativer}; 

    std::map<std::string, mathfunc> mathmap; 

    for(int i = 0; i < ID_SIZE; ++i) { 
     mathmap.insert(std::make_pair(ID[i], mfuncs[i])); 
    } 

    //C2064: term does not evaluate to a function taking 1 argument 
    int result = *mathmap["doubler"](3); 

    return 0; 
} 

함수에 전달할 매개 변수가 없으면이 방법이 효과가 있다고 생각합니다. 하지만 어떻게 이런 식으로 매개 변수를 전달합니까?

답변

3

귀하의 mathfunc의 멤버 함수, 그래서 당신은 그들을 호출 할 객체가 필요합니다

class maptest { 
public: 
    static int doubler(int val) { return val * 2; } 
    static int halver(int val) { return val/2; } 
    static int negativer(int val) { return val > 0 ? -val : val; } 
}; 

을 그리고 mathfunc을 정의 : 당신은 정적 당신의 멤버 함수를 만들 수,

maptest mt; 
int result = (mt.*(mathmap["doubler"]))(3); 

을 대안으로 따라서 :

typedef int (*mathfunc)(int); 

그리고이 w 당신이 원래 게시물에 그들에게 당신이 그들을 호출하는 방법을 호출 할 수 울드 :

typedef int (*mathfunc)(int); 

공지 사항, 방법이 디자인은보다 유연하게 할 수 있다는 것은 pass any type of callable object 당신을 허용 할 std::function의 사용을 확인하는 것입니다. 예 :

typedef std::function<int(int)> mathfunc; 

mathfunc mfuncs[] = { 
    &maptest::doubler, 
    &maptest::halver, 
    &maptest::negativer, 
    [] (int i) { return i * 2; } // <== A LAMBDA... 
    }; 
+0

(mt. * (mathmap [ "doubler"]))에 대한 브라케팅은 혼란 스럽습니다. 왜 외부 브라켓 팅이 필요합니까? 즉, 여기 (mt. * (mathmap [ "doubler"])))? –

+0

@ user619818 : 필요하지 않습니다. 방금 상황을 명확하게 만들었다 고 생각했습니다. 아마 내가 틀렸어;) –

+0

내 VS2008 컴파일러에서 필요합니다. 문제 없어. –

1

정적 멤버가 아닌 함수를 호출하고 있습니다.

다음을 수행하십시오.

maptest t; 

int (maptest::*tptr) (int) = mathmap["doubler"]; 

int result = (t.*tptr)(2); 

희망이 도움이됩니다.

관련 문제