Как применить разные экземпляры к одному и тому же имени объекта? - PullRequest
1 голос
/ 27 марта 2012
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, имя типа T1, имя типа T2. Мне нужны разные экземпляры этого шаблона. Но объект C будет уничтожен после переключения. Как применить разные экземпляры к одному и тому же имени объекта?

Ответы [ 2 ]

2 голосов
/ 27 марта 2012

В этом случае, я думаю, лучший вариант - переосмыслить класс 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 голос
/ 27 марта 2012

Поместите общую часть в другую функцию, и тогда вы можете легко это сделать. Кроме того, всегда используйте входные данные из потока как часть проверки цикла или делайте это условие прерывания.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...