在當前狀態下,程序驗證數據類型的輸入:int和string。函數模板重載(不同數據類型驗證函數作爲參數)
//valid score range between 0 and 100
bool validScore(int value)
{
if(value < 0 || value > 100)
return false;
return true;
}
//valid name composed of letters
bool validName(string word)
{
for(int i = 0; i < word.length(); i++)
{
if(!isalpha(word[i]))
return false;
}
return true;
}
輸入是通過兩種函數爲每種數據類型獲取的:get_int()和get_word()。
對於int範圍未指定且名稱可能包含任何字符的情況,驗證函數是可選參數。
bool get_int(const string&, int&, bool(*validScore)(int) = 0);
bool get_word(const string&, string&, bool(*validWord)(const string) = 0);
// bool get_int(const string& prompt, int&n, (*validScore)(int))
bool get_word(const string& prompt, string&word, bool(*validWord)(const string))
{
while(1)
{
string line;
cout << prompt;
if(!getline(cin, line)
break;
istringstream iss(line);
if(iss >> word) // iss >> n
{
// validScore == 0 || validScore(n)
if(validWord == 0 || validWord(word))
return true;
}
}
return false;
}
我在想,如果可能的話,如何正確聲明一個函數模板,可以簡化流程時需要驗證。
template<typename T> bool get_item(const string&, T&, ???);
將函數模板get_item重載與不同的驗證函數是一個潛在的解決方案嗎?
好像你只是想要一個模板函數'valid(const T&)',它只支持它所支持的類型的專門化? – dwcanillas