我可以在 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?

提问人:kitshaar 提问时间:8/16/2023 最后编辑:Mark Rotteveelkitshaar 更新时间:10/12/2023 访问量:77

问:

这行代码是错误的,无法编译,我想知道如何修复它。

#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';
}

请指出,是否有办法使之成为可能,或者如果不可能,那为什么?

我想从用户那里接收一个整数值,并根据他们输入的值创建一个变量。

例如,如果他们输入 ,则将创建一个整数变量。如果他们输入 ,则将创建一个双精度变量,因为它是一个分数值。5656.78

C++ 模板 input C++20 auto

评论

4赞 user17732522 8/16/2023
编译器无法知道您想要什么类型。用户键入的内容无法确定类型。因此,您需要致电或类似电话来告知您想要哪种类型。getValue<int>()
8赞 user17732522 8/16/2023
"例如,如果他们输入 56,那么将创建一个整数变量“: 你怎么知道它应该是一个整数而不是一个字符串?你怎么知道它不会跟在后面,所以它“应该”是一个?这是不可能的。56.123double
6赞 user17732522 8/16/2023
撇开这些不谈,类型在编译时是固定的。变量的类型不能取决于用户键入的内容。
2赞 463035818_is_not_an_ai 8/16/2023
调用该参数时,该参数必须已知。通常,根据用户输入来决定类型并非易事。例如,如何区分字符串和整数?getValueT33
0赞 kitshaar 8/16/2023
@user17732522嗯,(点头)。thnx 指出潜在的问题。

答:

1赞 Alan Birtles 8/16/2023 #1

类型在编译时是固定的,因此您的代码无法工作。如果你真的需要这样做,那么有几种方法。

  1. Javascript 方法只是在任何地方使用,double 可以容纳 53 位整数而不会失去精度。double
  2. 返回一个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");
  }
}