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