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

SD.*_*SD. 2 c++ types integer

我正在尝试编写if语句但无法找到正确的表达式表单.我在想写这样的东西:

if ( var != type(int) )
Run Code Online (Sandbox Code Playgroud)

但是,我不确定如何去做这个,这个方法不起作用.

我至少在思考正确的方向吗?

GMa*_*ckG 18

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

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)
}
Run Code Online (Sandbox Code Playgroud)

如果您想要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
}
Run Code Online (Sandbox Code Playgroud)

根据你的评论("任务在手边是一个简单的程序:取两个用户输入的整数并添加它们.仅将输入限制为整数.我可以在Python中完成它,我也在考虑这些行.如果num1!= type( int):print"你没输入整数,请输入一个整数."否则:继续"),你想要这样的东西:

#include <iostream>

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

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

这将通知无效的输入,如"@#$","R13",但并没有追上的情况下,如"34fg","12 $#%",因为它会读取int,并在"fg"和"$停止#%", 分别.

要检查这一点,您必须读入一行输入,然后尝试将该行转换为您想要的类型.(谢谢,litb).这意味着你的问题更像是这个问题:

#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
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这将执行以下操作:获取输入,并将其放入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
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

或者更一般地说:

#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
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这让你解析其他类型的错误检查.


如果你没有例外,使用lexical_cast(来自boost或"faked",请参阅代码中链接的另一个问题[与上面的链接相同]),你的代码看起来像这样:

#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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我不认为boost有一个没有抛出版本的词法转换,所以我们可以通过捕获这个代码来制作一个真/假而不是异常的版本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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在它回到了bool结果,除了我们通过使用现有lexical_cast函数避免代码重复.

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

  • 我想知道有人能给出一个至少对我来说这个难以理解的问题的答案!努力+1! (3认同)

fbr*_*eto 9

C++是一种静态类型语言,这意味着编译器始终知道变量的类型.var因此,为了声明,你必须为它指定一个类型,这使你发布的if语句没有实际意义.如果您可以描述您想要完成的任务,可能还有另一条路可以解决您的问题.

  • 在这种情况下,我想你想问一个问题,"我怎样才能确保来自用户的输入被限制为整数"?有几种方法可以在C++中从用户那里获得输入,并且每种方式都有验证用户数据的技术.此外,它还有助于您在问题正文中编写更多代码. (3认同)