C++ 如何将不同的实例化应用于对象的相同名称? int-lim; 做{ cin>>lim; 开关(直线电机) { 案例1:{mpa C;}断裂; 案例2:{mpa C;}断裂; 案例3:{mpa C;}断裂; 案例4:{mpa C;}断裂; 案例5:{mpa C;}断裂; 默认值:cout

C++ 如何将不同的实例化应用于对象的相同名称? int-lim; 做{ cin>>lim; 开关(直线电机) { 案例1:{mpa C;}断裂; 案例2:{mpa C;}断裂; 案例3:{mpa C;}断裂; 案例4:{mpa C;}断裂; 案例5:{mpa C;}断裂; 默认值:cout,c++,templates,C++,Templates,在这种情况下,我认为最好的选择是重新考虑classmpa在编译时不需要第一个参数。说真的,每个人都讨厌重写东西,但这是你应该做的 因为我知道你会忽略这一点,这里有一个解决方法: 创建一个类mpa\u base,该类继承自mpa,并具有所有相同的函数,但它们都是虚拟的(尤其是析构函数)。然后,您可以执行以下操作: int lim; do{ cin>>lim; switch(lim) { case 1: {mpa<1,int,

在这种情况下,我认为最好的选择是重新考虑class
mpa
在编译时不需要第一个参数。说真的,每个人都讨厌重写东西,但这是你应该做的

因为我知道你会忽略这一点,这里有一个解决方法:

创建一个类
mpa\u base
,该类继承自
mpa
,并具有所有相同的函数,但它们都是虚拟的(尤其是析构函数)。然后,您可以执行以下操作:

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);
typedef-mpa\u-base-mpa\u-int\u-pchar;
std::unique_ptr C;//这是指向mpa对象的智能指针
int lim;
做{
cin>>lim;
开关(直线电机)
{
案例1:C.复位(新的mpa());断裂;
案例2:C.复位(新的mpa());断裂;
案例3:C.复位(新的mpa());断裂;
案例4:C.复位(新的mpa());断裂;
案例5:C.复位(新的mpa());断裂;

默认设置:cout在另一个函数中重构公共部分,然后您就可以轻松地执行此操作。此外,始终将来自流的输入作为循环检查的一部分,或者将其设置为中断条件

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);
模板
无效foo(兆帕常数和兆帕){
//不管你想做什么,在这里做
}
int lim=0;
做{
如果(!(cin>>lim)){//输入中断
cin.clear();//清除错误标志
中断;//退出
}
开关(直线电机)
{
案例1:{foo(mpa(/*params*/);}break;
案例2:{foo(mpa(/*params*/);}break;
案例3:{foo(mpa(/*params*/);}break;
案例4:{foo(mpa(/*params*/);}break;
案例5:{foo(mpa(/*params*/);}break;

默认设置:不要忘记接受解决问题的答案!
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);