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

C++ C++;语法问题:if var!=int型,c++,integer,types,C++,Integer,Types,我试图写一个if语句,但找不到合适的表达式形式来使用。我在考虑写这样的东西: if ( var != type(int) ) #include <iostream> int main(void) { int i; std::cin >> i; if (std::cin.fail()) { std::cout << "Not valid!" << std::endl; } else

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

if ( var != type(int) )
#include <iostream>

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

    if (std::cin.fail())
    {
        std::cout << "Not valid!" << std::endl;
    }
    else
    {
        // ...
    }
}
#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;
    }
}
double x = 4.99999999999;
if(abs(round(x) - x) < 1e-8)
然而,我不确定该怎么做,而且这种方法不起作用


至少我的想法是正确的吗?

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

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
}
这将执行以下操作:获取输入,并将其放入
stringstream
。然后,在解析
int
之后,将剩余的空格流出来。之后,如果
eof
为false,则表示有剩余字符;输入无效

这在函数中更易于使用。在另一个问题中,演员被重新考虑;在这个问题中,我们使用的是cast,但是将输入与它一起包装

#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
    {
        // ...
    }
}
我不认为boost有一个无抛出版本的词法转换,所以我们可以通过捕获
坏的抛出
,来生成这段代码的真/假版本,而不是异常版本,如下所示。同样,这可以与
boost
或自定义词法转换一起使用。(任何执行词法转换并抛出
错误转换的内容
):

#包括
#包括
#包括
/*从问题中伪造词汇:
https://stackoverflow.com/questions/1243428/convert-string-to-int-with-bool-fail-in-c/
*/
模板
词法转换(const std::string&s)
{
标准::stringstream ss(s);
T结果;
如果((ss>>result).fail()| |!(ss>>std::ws).eof())
{
投掷标准::坏掷(“坏掷”);
}
返回结果;
}
模板
布尔型(T&T)
{
std::字符串输入;
std::getline(std::cin,输入);
尝试
{
t=词汇转换(输入);
返回true;
}
捕获(常数标准::坏的\u铸件和e)
{
返回false;
}
}
内部主(空)
{
int i;
if(!parse_type(i))
{

std::coutC++是一种静态类型语言,这意味着编译器随时都知道变量的类型。因此,为了声明
var
,您必须为它指定一个类型,这使得您发布的if语句成为一个无意义的点。如果您能够描述更多您试图完成的任务,可能有一个另一种解决问题的方法。

没错,需要更多的信息,如果您正在寻找Java的“instanceOf”操作符的等价物,那么就没有了,除非您使用RTTI和typeid。

您的意思是您有一个浮点值,并且想知道它是否是整数

在这种情况下,请尝试以下方法:

#include <math.h>

//...

double x = 5.0;
if(round(x) == x) {
   // x has an integer value
}
#包括
//...
双x=5.0;
如果(圆形(x)=x){
//x有一个整数值
}
或者,如果该值是某些计算的结果,则可能存在较小的舍入误差。然后尝试以下操作:

if ( var != type(int) )
#include <iostream>

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

    if (std::cin.fail())
    {
        std::cout << "Not valid!" << std::endl;
    }
    else
    {
        // ...
    }
}
#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;
    }
}
double x = 4.99999999999;
if(abs(round(x) - x) < 1e-8)
double x=4.99999999;
if(abs(圆形(x)-x)<1e-8)

我想知道有人能回答这个问题,至少对我来说是不可理解的问题!1的努力!!这更为合理。WS的添加也很棒。谢谢,记住,就像其他人所说的,C++是强类型的。这些都是从字符串流到相应类型的转换。您的示例非常详细。为什么不这样做:返回std::cin>>t;
std::ws
方法在
stringstream
上运行得非常好,但在连接到终端的
std::cin
上运行时,它将等待您按下
enter
,直到您输入一些非空格并再次按下enter。W当使用
std::ws
方式时,我总是将整行读入字符串,然后对stringstream执行剩余的工作。if语句的主体中有什么?(换句话说,您避免对int做什么?)int n;if(cin>>n){…}如果你在if语句中找到,那么你知道你的变量n是从字符串中正确转换的。在C++中,这些类型在编译时是已知的,所以你的问题有点奇怪。也许这有助于澄清,因为你似乎熟悉Python:Python和C++中,当你读输入时,你都把它读为一个字符串。将字符串转换成整数。问题是要确定转换是否成功。关键在于,在C++中,既然已经声明了代码> var >代码>为整数,它将始终是一个整数。无论从字符串到整数的转换是否成功都不重要,<代码> var >代码>将是整数。不管怎样。这有意义吗?谢谢你澄清这一点。Daniel。手头的任务是一个简单的程序:获取两个用户输入的整数并将它们相加。将输入限制为整数。我可以用Python来做,我也在按照这些思路思考。如果num1!=type(int):打印“您没有输入整数,请输入整数。”否则:继续在这种情况下,我想你应该问一个问题,“如何确保来自用户的输入被限制为整数?”在C++中,有几种方法可以从用户那里获得输入,每种方法都有验证你所得到的用户数据的技术。此外,它还可以帮助你在你的问题中写出更多的代码。你不必担心在运行时将输入类型限制为整数。ys A integer.True-但我不熟悉OP是如何从用户处获取输入的。例如,如果他们使用getline,他们必须自己验证数据。您的观点在给出示例后仍然有效。@SD:通常,您应该问“如何解决此问题”,而不是“如何使此尝试有效”基于以上的评论,我认为你完全可以说你是在完全错误的轨道上(实际上,那个轨道在错误的星球上)。在C++中,为了得到正确的类型化输入,一个使用流。