2014-11-16 3 views
0

내 말은 콘솔에서 (예 : 한 번에 입력하고 싶은만큼) 사용자의 매개 변수를 사용하는 프로그램을 만드는 것입니다.개체를 함수에 매핑하는 올바른 C++ 방법은 무엇입니까?

-p /users/me/myFolder/myHtmlFile.html -d /users/me/myOtherFolder -n myHmtlFileStyles -r 

프로그램을 실행 한 후, 매개 변수 -p, -d-n을 설정 (즉 -r가하는 일의 원인) 것입니다. 이미 입력 문자열에서 공백으로 둘러싸인 각 부분 문자열을 통과하는 함수를 작성했습니다. 그래서 n00b 디자인 패턴은 다음과 같을 것이라고 생각합니다.

if (this_substring == "-p") 
{ 
    // ... run some procedure 
} 
else if (this_substring == "-d") 
{ 
    // ... run some procedure 
} 
else if (this_substring == "-n") 
{ 
    // ... run some procedure 
} 
else if (this_substring == "-r") 
{ 
    // ... run some procedure 
} 
else 
{ 
    // ... trigger not recognized; throw an error 
} 

그러나 나는 더 우아하고 적절한 방법이있을 것이라고 확신합니다. 예를 들어, 함수에 string을 매핑하는 방법이 있습니까?

std::map<std::string, function> triggerMap = {{"-p", function1()}, {"-d", function2()}, "-n", function3()}, {"-r", function4()}}; 

??????

답변

-1

스위치와 여러 개의 케이스를 사용하십시오. 플래그 (-r, -n 등)를 식별하고 문자를 추출한 다음이를 케이스 레이블로 사용하십시오. 아마도 익명의 람다 클로저처럼 우아하지는 않지만 더 일반적으로 C++ 일 것입니다.

2

당신은 객체를 작동 람다와 함수 객체를 초기화하고 그것의 키를 기반으로 전화를 문자열에서 std::unordered_map을 구축 할 수 있습니다 : 물론

std::unordered_map<std::string, std::function<void()>> fns { 
    { 
     "-p", 
     []() { 
      // do stuff 
     } 
    }, 
    { 
     "-d", 
     []() { 
      // do something else 
     } 
    } 
}; 

fns[param](); 
+0

여기에지도를 통해 unorderd_map 선택한 이유라도? – stijn

+0

@stijn 여기서는 순서가 필요하지 않으므로 키 - 값 조회 용 관용적 솔루션은 'unordered_map'인 해시 테이블입니다. –

0

, 당신은 함수 포인터를 사용할 수 있습니다. 하지만 당신은 그냥 getopt에를 사용하는 것이 좋습니다

참조 : 귀하의 경우 http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html

:

while ((c = getopt (argc, argv, "p:d:n:r:")) != -1) 
{ 
    switch (c) 
    { 
     case 'p': 
      function(optarg); 
      break; 
     case 'd': 
      function(optarg); 
      break; 
     case 'n': 
      function(optarg); 
      break; 
     case 'r': 
      function(optarg); 
      break; 
    } 
} 
관련 문제