0

我一直想知道的东西,因为它似乎出现在我没有经验的代码中。

我有一些代码经常使用 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;
    }


}

每个语句中唯一改变的是队列变量。有没有一些巧妙的方法来压缩这种重复的代码?

4

3 回答 3

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
于 2012-04-23T20:44:27.363 回答
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 
于 2012-04-23T20:51:24.037 回答
0

显而易见的答案是switch用一个vectormap查找要打开的东西来替换。

但是,我认为整数和向量索引之间的耦合是一个泄漏接口。

我想知道这个函数的调用者如何知道要使用哪个整数值。谁告诉他们使用什么?他们可能只是被赋予了对一个Storage对象的引用吗?

代替:

int function_telling_which_index_to_use_for_storage();

和:

Storage* storage_to_use();

然后你可以说:

Storage* storage = storage_to_use();
// ...
storage->store(posx, posy);

记住:封装,封装,封装。

于 2012-04-23T21:09:44.873 回答