提问人:kitshaar 提问时间:8/16/2023 最后编辑:Mark Rotteveelkitshaar 更新时间:10/12/2023 访问量:77
我可以在 C++ 中使用模板或 auto 关键字来创建一个变量,我可以将其与 std::cin 一起使用以从用户那里获取值吗?
Can I use template or auto keyword in C++ to create a variable that I can use with std::cin to get a value from user?
问:
这行代码是错误的,无法编译,我想知道如何修复它。
#include <iostream>
template <typename T>
auto getValue()
{
std::cout << "Enter an integral value: ";
T value{};
std::cin >> value;
// I would do input handing later
return value;
}
int main()
{
auto value1{getValue()};
std::cout << value1 << '\n';
}
请指出,是否有办法使之成为可能,或者如果不可能,那为什么?
我想从用户那里接收一个整数值,并根据他们输入的值创建一个变量。
例如,如果他们输入 ,则将创建一个整数变量。如果他们输入 ,则将创建一个双精度变量,因为它是一个分数值。56
56.78
答:
1赞
Alan Birtles
8/16/2023
#1
类型在编译时是固定的,因此您的代码无法工作。如果你真的需要这样做,那么有几种方法。
- Javascript 方法只是在任何地方使用,double 可以容纳 53 位整数而不会失去精度。
double
- 返回一个
std::variant
选项 2 可能如下所示:
#include <variant>
#include <iostream>
#include <string>
#include <optional>
std::optional<int> parseInt(const std::string& str)
{
try
{
size_t pos;
int value = std::stoi(str, &pos);
if (pos == str.size())
{
return value;
}
}
catch (std::exception&)
{
}
return {};
}
std::optional<double> parseDouble(const std::string& str)
{
try
{
size_t pos;
double value = std::stod(str, &pos);
if (pos == str.size())
{
return value;
}
}
catch (std::exception&)
{
}
return {};
}
std::variant<int, double> getValue()
{
while (true)
{
std::cout << "Enter a numerical value: ";
std::string str;
std::getline(std::cin, str);
auto i = parseInt(str);
if (i)
{
return *i;
}
auto d = parseDouble(str);
if (d)
{
return *d;
}
throw std::invalid_argument("invalid input");
}
}
评论
getValue<int>()
56
.123
double
getValue
T
3
3