我有一段需要大量用户输入的代码。我想确保用户输入了正确的输入类型,如果没有,提示他们输入正确的内容。
现在我可以通过包含所有可能输入的大量if
语句来做到这一点,但我确信一定有更好、更有效的方法。我已经看到了一些可能的替代解决方案(例如typeid
, throw/catch
),但它们似乎在这是否是一种好的编程技术方面存在分歧。
那么解决这个问题的最佳方法是什么?
我从传入的输入中概述了我知道/需要的内容:
- 我知道用户应该输入什么类型(它们是
ints
,doubles
或strings
)。 - 我需要检查他们是否输入了正确的输入,如果没有提示他们输入 type 的输入
X
。 - 代码最好需要存储在函数(或模板等)中,并且适用于所有 3 种情况,因为需要执行此检查/读取的情况很多。
我还应该注意我正在使用getline(cin,X)
,因为我的一些输入包含空格。这是我所指的代码:
while(again==1){
cout<<"Please enter student name: "<<endl;
sName=clear_and_read<string>();
cout<<"Please enter student ID: "<<endl;
sID=clear_and_read<int>();
cout<<"What course does the student study? (1)Physics etc...."<<endl;
sCourse=clear_and_read<int>();
cout<<"How many results would you like to enter for this student?: "<<endl;
d=clear_and_read<int>();
student* S1= new physics(sName,sID); //*********
//physics S1(sName,sID);
if(sCourse==1){
for(int i(0);i<d;i++){
string cName("Nill"); double cResult(0);int cCode(0);
cout<<"Please enter course "<<i+1<<" code: "<<endl;
cCode=clear_and_read<int>();
cout<<"Please enter course "<<i+1<<" title: "<<endl;
cName=clear_and_read<string>();;
cout<<"Please enter result "<<i+1<<": "<<endl;
cResult=clear_and_read<double>();;
(*S1).addresult(cName,cCode,cResult);
}
}
//allstudents.insert(pair<int,student*>(sID,S1)); //*********
allstudents[sID]=S1; //THIS LINE
cout<<"Would you like to enter another student manually? (1)Yes (2)No :"<<endl;
again=clear_and_read<int>();;
}
目前我在哪里制作了未完成的模板函数clear_and_read
,该函数将检查传入的数据是否与输入到模板中的数据相同,但我被困在如何做到这一点上。
template <class T> T clear_and_read(){ //NOT CORRECT YET
string name;
cin.ignore();//skips "enter" still in cin stream
cin.clear();
getline(cin,name);
T typeoutput;
//needs to check for valid type
//assign name to typeoutput
return typeoutput;
}
在插入这个模板类之前,代码sName=clear_and_read<string>();
本来就是getline(cin,sName);
等等。
作为旁注,我所说的“相当数量的if
语句”的意思是,在每个必需的输入之后都需要一个 if-check/else 语句。
我是不是把事情复杂化了?
希望这很清楚。