我可以在C++中使用template或auto关键字来创建一个变量,并与std::cin一起使用来从user获取值吗?

uinbv5nw  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(93)

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

#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,那么将创建一个double变量,因为它是一个分数值。

rxztt3cl

rxztt3cl1#

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

  1. JavaScript的方法是在所有地方使用double,double可以保存53位整数而不会丢失精度。
    1.返回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");
  }
}

相关问题