【问题标题】:How to use a single variable which can have multiple data types in C++如何在 C++ 中使用可以具有多种数据类型的单个变量
【发布时间】:2020-05-29 05:16:09
【问题描述】:

一个变量怎么可能有两种数据类型?如果“月”是一个变量,它应该取自 std::cin 的输入。我应该怎么做才能让用户输入像“January”这样的字符串或输入像1这样的整数?

【问题讨论】:

  • 使用std::string作为月份变量,并在用户输入后通过检查它是“一月”还是“1”来验证
  • 简单,为您的程序选择一种内部表示(例如,我建议使用从 1 到 12 的 int)。然后将用户输入读取为字符串,并将用户输入的内容转换为您选择的任何内部表示。
  • 用户将输入输入为 text。没有其他的。由您的程序决定用户键入的文本是否是您正在寻找的任何内容的有效表示。因此,请查看文本并决定如何处理它。

标签: c++


【解决方案1】:

在 C++ 17 中,我们得到了一个叫做 std::variant 的东西,它基本上是一个类型安全的联合 要使用它,您只需声明所需的类型:

std::variant<int, std::string> data;

data = "Hello!";
data = 13;
// No Compilation Issues

困难的部分是当您想要检索数据时

std::string& text = std::get<std::string>(data):
int& number = std::get<int>(data);

但请确保您定义的最后一个类型是您尝试检索含义的类型:

data = 13;
std::string& text = std::get<std::string>(data); // Bad Exception Error

更好的是使用 std::get_if

if (auto temp = std::get_if<std::string>(&data);
    std::string& text = *temp; // do what ever you want

我希望这能回答您的问题快乐编码!

【讨论】:

  • std::visit 通常更好。
  • 赞成按字面意思回答问题。在寻找问答时,这可能是令人沮丧的根源,而您发现的只是确切的问题,但答案却说“不要这样做”,这就是我在回答中所做的。尽管如此,我不会将std::variant&lt;int,std::string&gt; 用于month,而且我也相信OP 不应该
【解决方案2】:

一个变量怎么可能有两种数据类型?

它不能。一个对象有一种类型。单个类型可以表示不同类型的值(联合,std::variant)。但是,您在这里不需要它。用户输入1 还是"January" 无关紧要,因为它们是同一月份。

我应该怎么做才能让用户输入像“January”这样的字符串或输入像1这样的整数?

当您读取用户输入时,将其读取为std::string。在内部你可以使用枚举:

#include <iostream>
#include <string>

enum class month { January, February, Mazember};

std::istream& operator>>(std::istream& in, month& m){
    std::string temp;
    in >> temp;
    if (temp == "1" || temp == "January") { 
        m = month::January;
    }
    //...
    return in;
}

std::ostream& operator<<(std::ostream& out,const month& m) {
    if (m == month::January) {
        out << "January";
    }
    //...
    return out;
}

int main()
{
    month m;
    std::cin >> m;
    std::cout << m;
}

【讨论】:

    【解决方案3】:

    声明会发生冲突。您不能使用单个标识符声明两种不同的数据类型。例如,std::string monthint month 将引发错误。请看以下内容:

    #include <iostream>
    
    int main(void) {
        int month = 2;
        std::string month = "January"; // confliction
    }
    

    你会得到一些东西:

    error: conflicting declaration 'std::string month'
        5 |     std::string month = "January";
          |                 ^~~~~
    vectors.cpp:4:9: note: previous declaration as 'int month'
        4 |     int month = 2;
          |         ^~~~~
    

    您可以重载函数,但不能重载变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-30
      • 2017-09-15
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 2014-03-15
      相关资源
      最近更新 更多