我在這個論壇上發現了用戶 Ben Voigt 寫的以下片段:
//forward declaration
template<typename T>
T getline_as(std::istream& s);
template<>
std::string getline_as<std::string>(std::istream& s)
{
std::string str;
std::getline(s,str);
return str;
}
template<typename T>
T getline_as(std::istream& s)
{
std::stringstream convert(getline_as<std::string>(s));
T value;
convert >> value;
return value;
}
我正在尋找一種方法來處理convert >> value;. 我的目標是迭代對用戶的請求,使其正確插入給定的輸入:
int main()
{
std::cout << "Please enter a number: ";
double number{getline_as<double>(std::cin)};
}
我的想法是在內部創建一個do-while回圈,getline_as但我無法使其作業。
template<typename T>
T getline_as(std::istream& s)
{
std::stringstream convert;
T value;
do
{
convert(getline_as<std::string>(s));
}
while(!(convert >> value));
return value;
}
uj5u.com熱心網友回復:
std::stringstream convert(...);convert(...); 是一個建構式呼叫,但是在創建流之后嘗試執行是非法的(它需要流多載operator(),但它不會這樣做)。convert = std::stringstream(...)會作業,但我只是完全重新創建流。
您還應該使用 read-only std::istringstream,因為您從不向其寫入任何內容。
我還做了一些外觀上的改變,最終得到以下結果:
template <typename T>
[[nodiscard]] T getline_as(std::istream &s);
template <>
[[nodiscard]] std::string getline_as<std::string>(std::istream &s)
{
std::string str;
std::getline(s, str);
return str;
}
template <typename T>
[[nodiscard]] T getline_as(std::istream &s)
{
while (true)
{
T value{};
std::istringstream convert(getline_as<std::string>(s));
if (convert >> value)
return value;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/473692.html
上一篇:解包可變引數并相應地傳遞它的元素
