Ho letto la tua template e per intenderci, la modifica che volevo apportare ma non mi riesce (o meglio mi riuscirebbe ma perdendo in generalità...) è un qualcosa di questo tipo, in cui si distingue il caso in cui Result debba essere int.
codice:
#include <iostream>
#include <limits>
#include <string>
#include <typeinfo>
template<typename InType> void AcquireInput(std::ostream & Os, std::istream & Is, const std::string & Prompt, const std::string & FailString, InType & Result)
{
bool check;
double aux;
do
{
Os<<Prompt.c_str();
if(Is.fail())
{
Is.clear();
Is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
if(typeid(Result).name() == "int")
{
Is>>aux;
check = ((Is.fail())||(((int)aux-aux)!=0));
}
else {
check = (Is.fail());
}
if(check){
Os<<FailString.c_str();
}
else{
Is>>Result;
}
} while(check);
}
template<typename InType> InType AcquireInput(std::ostream & Os, std::istream & Is, const std::string & Prompt, const std::string & FailString)
{
InType temp;
AcquireInput(Os,Is,Prompt,FailString,temp);
return temp;
}
probabilmente è sbagliato qualcosa, ma è solo per intenderci...