2012-03-27 53 views
1
int lim;  
do{ 
     cin>>lim; 
     switch(lim) 
     { 
     case 1: {mpa<1,int,const char*> C; }break; 
     case 2: {mpa<2,int,const char*> C; }break; 
     case 3: {mpa<3,int,const char*> C; }break; 
     case 4: {mpa<4,int,const char*> C; }break; 
     case 5: {mpa<5,int,const char*> C; }break; 
     default: cout<<"Incorrect number, please repeat\n"; 
     } 
}while(lim<1 || lim>5); 

我想將一個值(1,2,3,4或5)傳遞給模板int a,typename T1,typename T2。我需要此模板的不同實例。但是對象C在切換後會被破壞。如何將不同的實例應用於相同的對象名稱?如何將不同的實例應用於相同的對象名稱?

+0

不要忘記接受解決您的問題的答案! – Shahbaz 2012-03-27 21:10:44

回答

2

在這種情況下,我認爲最好的辦法是重新考慮mpa類不要求在編譯時間第一個參數。說真的,大家都討厭重寫東西,但這就是你應該做的。

因爲我知道你會忽略的是,這裏有一個解決方法:

使類mpa_base<class, class>,即mpa繼承,並擁有所有相同的功能,但他們所有的虛擬(尤其是析構函數)。然後,你可以這樣做:

typedef mpa_base<int, const char*> mpa_int_pchar; 
std::unique_ptr<mpa_int_pchar> C; //this is a smart pointer to a mpa object 
int lim;  
do{ 
     cin>>lim; 
     switch(lim) 
     { 
     case 1: C.reset(new mpa<1,int,const char*>()); break; 
     case 2: C.reset(new mpa<2,int,const char*>()); break; 
     case 3: C.reset(new mpa<3,int,const char*>()); break; 
     case 4: C.reset(new mpa<4,int,const char*>()); break; 
     case 5: C.reset(new mpa<5,int,const char*>()); break; 
     default: cout<<"Incorrect number, please repeat\n"; 
     } 
}while(lim<1 || lim>5); 
1

重構在另一個函數的公共部分,然後你可以很容易地做到這一點。此外,始終將來自流的輸入作爲循環檢查的一部分,或使其成爲中斷條件。

template<class MPA> 
void foo(MPA const& mpa){ 
    // whatever you want to do, do it here 
} 

int lim = 0; 
do{ 
    if(!(cin >> lim)){ // broken input 
    cin.clear(); // clear error flags 
    break; // bail out 
    } 
    switch(lim) 
    { 
    case 1: { foo(mpa<1, int, char const*>(/*params*/)); }break; 
    case 2: { foo(mpa<2, int, char const*>(/*params*/)); }break; 
    case 3: { foo(mpa<3, int, char const*>(/*params*/)); }break; 
    case 4: { foo(mpa<4, int, char const*>(/*params*/)); }break; 
    case 5: { foo(mpa<5, int, char const*>(/*params*/)); }break; 
    default: cout<<"Incorrect number, please repeat\n"; 
    } 
}while(lim < 1 || lim > 5); 
相關問題