Buongiorno a tutti,
ho scritto questo codice di controllo input che, se testato a parte fa egregiamente il suo dovere per le finalità con cui è stato concepito:

codice:
#include <string>
#include <typeinfo>  
#include <iostream>


int ReadStr (std::string ins){
  std::locale loc;
  bool numb=true;
   for(int i=0; i<ins.length(); i++){
     numb = numb && (isdigit(ins[i],loc));
   }
   if(numb == true){return 0;}
   if(ins.length() == 1){return 1;}
   return 2;
}


template <typename T>
void Inserimento (T ins){
  int a, b;
  do{
  std::string str;
  std::cin.clear();
  std::getline(std::cin, str);
  if(typeid(ins) == typeid(int)){a = 0;}
  else if(typeid(ins) == typeid(char)){a = 1;}
  else {a = 2;}
  b = ReadStr(str);
  if (a != b){
    std::cout << "Inserimento non valido, riprovare -> \tScelta selezionata:  ";
  }
  }while (a != b);
}
Tuttavia, se lo collego al resto del programma, riscontro problemi:

codice:
do{
  std::cout<<"\n\n\u2022 Visualizza Catalogo (C)\n\u2022 Effettua un Ordine (O)\n\u2022 Visualizza il Carrello (B)\n\u2022 Rimuovi un prodotto dal carrello (R)\n\u2022 Termina e paga - Esci (Q)\n";
    std::cout<<"\nScelta selezionata: ";
    char c;
    Inserimento(c); // Leggo input utente
    switch(c) {  //Switch per i diversi casi
        case 'C' : //Catalogo
        case 'c' :
        Catalogo.print();
        break;
        case 'O' : // Ordine
        case 'o' :
            ordine(Catalogo, Carrello);
            break;
        case 'B' : //Carrello
        case 'b' :
            std::cout<<"\n";
            Carrello.print();
            break;
        case 'R' : //Rimovi
        case 'r' :
            std::cout<<"\n";
            remove(Catalogo,Carrello);
        break;
        case 'Q' : //quit
        case 'q' :
      std::cout<<"\n\nGrazie per aver scelto Grandi Magazzini PPP \nArrivederci al prossimo acquisto!\n\n";
        return;
        default : //In ogni altro caso
            std::cout<<"L'inserimento non è valido\n";
            while (std::cin.get() != '\n') // pulisco il cin
            {
                continue;
        }
        //  menu(Catalogo, Carrello);
    }
    }while('c' == 'q' || 'Q');
  }
Infatti, pur inserendo 'c' o le altre lettere disponibili nell'indice, questa non viene riconosciuta come tale e lo switch ricade sempre nel case "default".
Dove risiede questa "incompatibilità"?