2012-03-27 57 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); 
相关问题