2012-04-23 4 views
0

잠시 궁금해했던 점이 제 경험에 비추어 볼 때 상당히 복잡해 보입니다.switch 문을 응축 하시겠습니까?

switch 문을 많이 사용하는 코드가 있지만 실제로는 매번 다른 큐에 액세스하고 있습니다.

void store(int toSwitchOn, float posx, float posy){ 
    myDataStruct newValue; 
    newValue.psX = posx; 
    newValue.psY = posy; 

    switch(toSwitchOn){ 
     case 1: 
      queue1.push(newValue);   
      break; 
     case 2: 
      queue2.push(newValue);   
      break; 
     case 3: 
      queue3.push(newValue); 
      break; 
     case 4: 
      queue4.push(newValue); 
      break; 
     case 5: 
      queue5.push(newValue); 
      break; 
    } 


} 

각 명령문에서 유일한 변경 사항은 대기열 변수입니다. 이런 종류의 반복적 인 코드를 압축하는 독창적 인 방법이 있습니까?

+7

대기열 배열을 사용합니까? –

+0

외관상으로는 글로벌 대기열이 있습니다. 함수에 대신 전달해야합니다. 이는 벡터를 사용하면 쉽습니다. 'std :: vector > &'타입의 매개 변수를가집니다. – chris

답변

5

대기열을 벡터에 저장하십시오.

std::vector<std::queue<someType> > queues (5); 
//fill vector with your 5 queues 

//this replaces the switch: 
if (toSwitchOn >= 1 && toSwitchOn <= 5) 
    queue [toSwitchOn - 1].push (newValue); 
else 
    //default switch case 
+1

'toSwitchOn'가 1에서 5 사이가 아니면 원래 코드는 아무런 변화가 없습니다. 코드가 잘못되었습니다. – hvd

+0

@hvd, 지금은 더 감사해야합니다. 감사합니다. – chris

+0

편집 된 버전이 나에게 잘 어울립니다. – hvd

0
std::vector<std::queue<someType> > queues (5); 
//toSwitchOn is of type size_t and zero indexed. 
... 
if (toSwitchOn < queues.size()) 
    queue [toSwitchOn].push (newValue); //0 - 1 = undefined land...  
else  //default switch case 
+0

만약 당신이 내 대답을 참조한다면, 나는 단지 'toSwitchOn'이 [1,5]의 범위에 있다는 것을 설명 할 뿐이다. 이것은 스위치가 처리하는 것이다. – chris

0

확실한 답변에 전환 할 수있는 일의 vector 또는 map 조회로 switch을 대체 할 수 있습니다.

그러나 누출 인터페이스로 정수와 벡터 인덱스를 연결하는 것을 볼 수 있습니다.

이 함수의 호출자가 사용할 정수 값을 어떻게 알고 있는지 알고 싶습니다. 누가 사용하라고 했습니까? 방금 Storage 개체에 대한 참조가 대신 제공되었을 수 있습니까?

바꾸기 :

int function_telling_which_index_to_use_for_storage(); 

으로 :

Storage* storage_to_use(); 

가 그런 말을 할 수
Storage* storage = storage_to_use(); 
// ... 
storage->store(posx, posy); 

기억 캡슐, 캡슐, 캡슐화한다.

관련 문제