C++ 语法问题:if var != type int

2024-01-05

我正在尝试编写一个 if 语句,但找不到合适的表达式形式来使用。我正在考虑写这样的东西:

if ( var != type(int) )

但是,我不确定具体如何去做,而且这个方法不起作用。

我至少是沿着正确的思路思考的吗?


听起来你正在尝试重载一个函数:

void foo(int i)
{
    // stuff
}

void foo(float f)
{
    // stuff
}

int main(void)
{
    int i = 10;
    float f = 1.0f;

    foo(i); // calls foo(int)
    foo(f); // calls foo(float)
}

如果你想int- 特殊行为,然后在所有其他情况下还有其他行为,您可以使用模板:

template <typename T>
void foo(T t)
{
    // T is something
}

template <>
void foo(int i)
{
    // for int's only
}

int main(void)
{
    int i = 10;
    float f = 1.0f;
    double d = 2.0;

    foo(i); // calls specialized foo
    foo(f); // calls generic foo
    foo(d); // calls generic foo
}

根据您的评论(“手头的任务是一个简单的程序:获取两个用户输入的整数并将它们相加。仅将输入限制为整数。我可以用 Python 完成它,并且我也在沿着这些思路思考。 if num1 != type(int): print ”您没有输入整数,请输入整数。" else: 继续"),你想要这样的东西:

#include <iostream>

int main(void)
{
    int i;
    std::cin >> i;

    if (std::cin.fail())
    {
        std::cout << "Not valid!" << std::endl;
    }
    else
    {
        // ...
    }
}

这将通知无效输入,例如“@#$”、“r13”,但不会not捕获诸如“34fg”、“12$#%”之类的情况,因为它会读取int,并分别停在“fg”和“$#%”处。

要检查这一点,您必须读入一行输入,然后尝试将该行转换为您想要的类型。 (谢谢,lib)。这意味着你的问题更多喜欢这个问题 https://stackoverflow.com/questions/1243428/convert-string-to-int-with-bool-fail-in-c/:

#include <iostream>
#include <sstream>
#include <string>

int main(void)
{
    std::string input;
    std::getline(std::cin, input);

    std::stringstream ss(input);
    int i;
    ss >> i;

    if (ss.fail() || !(ss >> std::ws).eof())
    {
        std::cout << "Not valid!" << std::endl;
    }
    else
    {
        // ...
    }
}

这会执行以下操作:获取输入,并将其放入stringstream。然后解析之后int,流出所有剩余的空白。之后,如果eof为 false,表示有剩余字符;输入无效。

这在函数中使用起来要容易得多。在另一个问题中,演员阵容被重新考虑;在这个问题中,我们使用强制转换,但将输入与其一起包装。

#include <iostream>
#include <sstream>
#include <string>

bool parse_int(int& i)
{
    std::string input;
    std::getline(std::cin, input);

    std::stringstream ss(input);
    ss >> i;

    return !(ss.fail() || !(ss >> std::ws).eof());
}

int main(void)
{
    int i;

    if (!parse_int(i))
    {
        std::cout << "Not valid!" << std::endl;
    }
    else
    {
        // ...
    }
}

或者更一般地说:

#include <iostream>
#include <sstream>
#include <string>

template <typename T>
bool parse_type(T& t)
{
    std::string input;
    std::getline(std::cin, input);

    std::stringstream ss(input);
    ss >> t;

    return !(ss.fail() || !(ss >> std::ws).eof());
}

int main(void)
{
    int i;

    if (!parse_type(i))
    {
        std::cout << "Not valid!" << std::endl;
    }
    else
    {
        // ...
    }
}

这让您可以通过错误检查来解析其他类型。


如果您可以接受例外情况,请使用lexical_cast(无论是来自 boost,还是“伪造的”,请参阅代码中链接的其他问题[与上面的链接相同]),您的代码将如下所示:

#include <iostream>
#include <sstream>
#include <string>

/* Faked lexical-cast from question:
https://stackoverflow.com/questions/1243428/convert-string-to-int-with-bool-fail-in-c/
*/
template <typename T>
T lexical_cast(const std::string& s)
{
    std::stringstream ss(s);

    T result;
    if ((ss >> result).fail() || !(ss >> std::ws).eof())
    {
        throw std::bad_cast("Bad cast.");
    }

    return result;
}


template <typename T>
T parse_type(void)
{
    std::string input;
    std::getline(std::cin, input);

    return lexical_cast<T>(input);
}

int main(void)
{
    try
    {
        int i = parse_type<int>();
        float f = parse_type<float>();
    }
    catch (const std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }
}

我不认为 boost 有词法转换的无抛出版本,因此我们可以通过捕获来制作此代码的 true/false 而不是异常版本bad_cast的,如下。再一次,这适用于boost或自定义词汇转换。 (任何进行词法转换并抛出异常的东西bad_cast):

#include <iostream>
#include <sstream>
#include <string>

/* Faked lexical-cast from question:
https://stackoverflow.com/questions/1243428/convert-string-to-int-with-bool-fail-in-c/
*/
template <typename T>
T lexical_cast(const std::string& s)
{
    std::stringstream ss(s);

    T result;
    if ((ss >> result).fail() || !(ss >> std::ws).eof())
    {
        throw std::bad_cast("Bad cast.");
    }

    return result;
}


template <typename T>
bool parse_type(T& t)
{
    std::string input;
    std::getline(std::cin, input);

    try
    {
        t = lexical_cast<T>(input);

        return true;
    }
    catch (const std::bad_cast& e)
    {
        return false;
    }
}

int main(void)
{
    int i;
    if (!parse_type(i))
    {
        std::cout << "Bad cast." << std::endl;
    }
}

现在又回到了bool结果,除了我们通过使用现有的避免代码重复lexical_cast功能。

您当然可以选择您想要使用的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 语法问题:if var != type int 的相关文章

随机推荐

  • 如何在 C# 中将字符串“39.9983%”转换为“39%”?

    我不想直接四舍五入 39 So 9 99 应该成为 9 我希望这会起作用 字符串 str 39 999 string 输出 str Split 输出 0 将会有你的答案 Thanks
  • 如何将圆上的坐标转换为正方形上的坐标?

    我目前正在 LBP2 中开发一款游戏 该游戏修改了控制器提供输入的方式 这个问题 如何将正方形上的坐标转换为圆上的坐标 https stackoverflow com questions 1621831 how can i convert
  • 如何在UINavigationBar中添加UISegmentedControl?

    我尝试添加UISegmentedControl到底部UINavigationBar与标题 但我无法添加它并且我无法添加UISegmentedControl in the tableView headerView 因为我需要搜索栏tableV
  • 如何使用 .htaccess 删除网址末尾的“?m=1”?

    我刚刚将我的博客从 Blogger 移至 WordPress 并且移动 URL 出现问题 Wordpress有设置URL结构的功能 所以桌面版的URL就可以了 但是还有一个额外的 m 1移动版 Blogger URL 这就是我想做的 重定向
  • 如何在 SwiftUI 的列表中启用选择

    我正在尝试使用 SwiftUI 创建一个简单的多重选择列表 我无法让它发挥作用 List 采用第二个参数 即 SelectionManager 因此我尝试创建一个具体的实现 但是 它永远不会被调用 行也永远不会突出显示 import Swi
  • WiX:哪里可以下载引导程序?

    我正在运行 Visual Studio 2008 SP1 在尝试编译 WiX 项目时出现以下错误 找不到所需的文件 C Program 中的 setup bin 文件 微软 SDKs Windows v6 0A Bootstrapper E
  • 多个不同大小的 ggplot

    使用起来比较简单grid arrange in the gridExtra包来排列矩阵中的多个图 但是如何排列图 我正在处理的图来自ggplot2 当某些地块打算比其他地块更大时 在基地 我可以使用layout 例如下面的例子 nf lt
  • 如何使用 requirejs 从 CDN 加载 ace 编辑器主题?

    我正在尝试加载ace http ace c9 io来自带有 requirejs 的 CDN 的主题 Here http plnkr co edit CqQo6VDr0MyuyBkMIyQ4 p preview是一个plunkr 它说明了我的
  • 将 docker-compose 与 GELF 日志驱动程序结合使用

    根据到 Docker 官方文档 https docs docker com reference logging overview 可以得到stdout and stderr容器的输出为GELF消息 https www graylog org
  • 什么是Java API?

    我知道 API 是一组规则和协议 任何人都可以用示例向我解释什么是 Java API 及其功能 您可以在这里找到 Java APIhttp download oracle com javase 6 docs api index html h
  • Silverlight - 保护网络内的内容(DRM?)

    我想使用Windows 2003 的流媒体服务器和Silverlight 设置一些WMV 视频流 现在 不幸的是 Silverlight 仅支持 HTTP 这意味着人们只能下载视频 虽然这本身不是问题 但我想知道有哪些选项可以阻止它们在网络
  • 如果文件已存在,则自动重命名 Windows 方式

    我的 C 代码根据输入生成多个文本文件并将其保存在文件夹中 另外 我假设文本文件的名称与输入相同 输入仅包含字母 如果两个文件具有相同的名称 那么它只是覆盖前一个文件 但我想保留这两个文件 我不想将当前日期时间或随机数附加到第二个文件名 相
  • 如何让Json.NET为具有复杂值的属性设置IsSpecified属性?

    我有一个使用 ASP Net 构建的 Web 服务 到目前为止它仅使用 XML 作为输入和输出 现在它还需要能够使用 JSON 我们使用 xsd2code 从 XSD 生成模型 并可以选择创建 指定 属性 https learn micro
  • 如何查看iPhone现在处于哪个位置(横向或纵向)?

    我有一个带有选项卡栏的应用程序 每个选项卡中都有导航控制器 当用户摇动设备时 UIImageView在导航控制器中显示为子视图 但是UIImageView必须包含特殊图像 具体取决于设备的当前方向 如果我只写 void willAnimat
  • MKUserLocation 自定义视图不动!

    我为用户位置创建了一个自定义 MKAnnotationView MKAnnotationView mapView MKMapView mapView viewForAnnotation id
  • postgreSQL 斐波那契数列 - 查询没有结果数据的目的地

    所以我写了一个像这样的斐波那契数列函数 CREATE OR REPLACE FUNCTION fibonacci lastN INTEGER RETURNS int AS BEGIN WITH RECURSIVE t a b AS VALU
  • 将 listView 项目分类到不同的部分 - Android

    在我的列表视图中 我试图将我的数据划分 分类 到不同的部分 说我有一个州列表 我想根据他们的国家对它们进行分类 但我现在所拥有的是按字母顺序对我的数据进行分类 我不知道这是如何发生的以及我怎样才能实现我想要的 有人可以在这里指导我吗 我的适
  • 无法使用石墨配置grafana

    我使用 Nginx 为 Graphite 和 Grafana 提供服务 它们都在同一台服务器上运行 而不是我的桌面 我可以通过 Nginx 访问 Graphite 但是 grafana 似乎无法连接到 Graphite 错误 Graphit
  • 从 jar maven 依赖项中排除 .class 文件

    我有 3 个 Maven 项目 A B C A 依赖于 B 而 B 又依赖于 C A 的 POM 依赖于 B B 的 POM 依赖于 C 我想在构建 A 时排除 C 中的类文件 我怎样才能做到这一点 我尝试使用 maven jar plug
  • C++ 语法问题:if var != type int

    我正在尝试编写一个 if 语句 但找不到合适的表达式形式来使用 我正在考虑写这样的东西 if var type int 但是 我不确定具体如何去做 而且这个方法不起作用 我至少是沿着正确的思路思考的吗 听起来你正在尝试重载一个函数 void