Ciao a tutti,
per un progetto scolastico sto scrivendo un programma in C++ ad oggetti (nozioni base) per l’organizzazione e gestione di prodotti in un ipotetico magazzino.
Sto riscontrando grosse difficoltà con la definizione del controllo input. Per rendere la scrittura più maneggevole ne ho fatto una classe a parte e creato il file .h
La struttura indicativa da cui ci è stato indicato di partire è questa
codice:
template <class T>
void Inserimento(T& a){                         
    std::cin.clear();;
    std::cin>>a;
    if(std::cin.fail()){
      std::cout << "Inserimento non valido, riprovare -> \tScelta selezionata:  ";
      Inserimento(a);
    }
}

ma è ovviamente molto generica e per nulla efficiente.
Nel complesso del progetto, ho individuato tre diverse casistiche di input che devo verificare:
- int per numeri
- char per “scelta rapida” (y/n)
- string per controllo sui prodotti del catalogo
Nello specifico, ho pensato di sviluppare gli specifici controlli in base alla tipologia, così:
codice:
template <typename T>
void Inserimento(){                         
  T ins;
  std::locale loc;
  std::string insStr, insInt;
  bool check=false;
  do{
    std::cin.clear();
    std::cin>>ins;
    //controllo int
    if(std::is_same<T, int>()){
      insInt = ins;
      for(int i=0; i<insInt.length(); i++){
    if(isdigit(insInt[i])) {
      check=true;
      if(check != true){
        std::cout << "Inserimento non valido, riprovare -> \tScelta selezionata:  ";
        std::cin.clear();
        check=false;
        break;}
    }
      }
    }
    //controllo char
    else if(std::is_same<T, char>()){
      if(std::isalpha(ins,loc)){
    check=true;}
      else{
    std::cout << "Inserimento non valido, riprovare -> \tScelta selezionata:  ";
    std::cin.clear();}
    }
   //controllo string
    if(std::is_same<T, std::string>()){
      insStr = ins;
      for(int i=0; i<insStr.length(); i++){
    if(isalpha(insStr[i])) {
      check=true;
      if(check!= true){
        std::cout << "Inserimento non valido, riprovare -> \tScelta selezionata:  ";
        std::cin.clear();
        check=false;
        break;}
    }
      }
    }
    else{
      std::cout << "Inserimento non valido, riprovare -> \tScelta selezionata:  ";
      std::cin.clear();
      check=false;
    }
  }while(check==false);
}

E’ una struttura che ha senso? Si può rendere più lineare? Come posso migliorarlo?

Grazie a chiunque abbia voglia di darmi un consiglio