【问题标题】:Compare a Variable to a Data Type in C++将变量与 C++ 中的数据类型进行比较
【发布时间】:2013-11-10 13:46:05
【问题描述】:

我想知道是否有一种将变量与数据类型进行比较的简洁方法。

下面的例子不是一段正常运行的代码,但是注释和注释下面的代码应该能解释我的问题:

string inputString = "";
float inputFloat = 0.0;

cout << "Input a string: ";

getline(cin, inputString);
stringstream(inputString) >> inputFloat;

// Is there a way to compare a float variable to a string or float data type? 
if(inputFloat == string) { 
    cout << "inputFloat is not a float" << endl;
} else if(inputFloat == float) {
    cout << "inputFloat is a float!" << endl;
}

【问题讨论】:

  • inputFloat 应该等于floatstring 时?
  • 上面写着float inputFloat。这是非常明确的:它是float。此外,由于 C++ 没有基类类型,而且像 float 这样的内置数据类型不是对象......
  • typeid 关键字可能对此有所帮助。

标签: c++ string io getline stdstring


【解决方案1】:

这里:

stringstream(inputString) >> inputFloat;

当你这样做时,你正在调用一个operator&gt;&gt;(istream, float),所以你要么成功地读取了一个浮点数,要么失败并且什么也不加载。您可以在 stringstream 对象上检查 .fail() 以验证这一点。

由于您调用的是 operator&gt;&gt; 的特定重载,因此您不可能将“不同类型的变量”“加载”到 inputFloat 变量或类似的变量中。

【讨论】:

  • 感谢您的解释。
【解决方案2】:

您只需要简单检查std::getlineoperator&gt;&gt; 的返回值:

std::cout << "Input a string: ";
std::string inputString = "";
float inputFloat = 0.0;
if (std::getline(std::cin, inputString) && 
    std::istringstream(inputString) >> inputFloat)  {
    std::cout << "Succesfully read float: " << inputFloat;
}
else {
    // TODO: either getline failed to read string or >> failed to extract float
}

请注意,std::istringstream(inputString) &gt;&gt; inputFloat 构造一个临时字符串流,并使用专门设计用于从中提取float 值的&gt;&gt; 的适当重载。检查返回值还可以确保在输出inputFloat 时,它已成功从流中检索并包含有效值。

【讨论】:

    猜你喜欢
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2012-05-19
    • 1970-01-01
    相关资源
    最近更新 更多