在c ++中禁用隐式转换

时间:2013-04-29 10:58:56

标签: c++

是否可以在C / C ++中禁用隐式转换。

假设我想写一个有效性函数,只让我输入integers in range [1,10]

我写道:

#include <iostream>


using namespace std;

int main( )
{
    int var=0;
    cout << "Enter a number (Integer between 1 to 10) : ";

    while( (!(cin >> var )) || (var > 10 ) || (var < 1) )
    {
        cout << "U nuts .. It can only be [1,10]\n";
        cin.clear();
        cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
        cout << "Enter a number (Integer between 1 to 10) : ";
        }

    cout << "\nYou entered : " << var;

   return 0;
}

但是如果用户输入9.5,则通过将float 9.5转换为9并将其存储在var中来接受它。我希望任何浮动条目都被视为无效条目。我如何最紧凑地实现这一目标。

我不想做这类事情:

#include <iostream>
#include <cmath>


using namespace std;

int main( )
{
    float var=0;
    cout << "Enter a number (Integer between 1 to 10) : ";

    while( (!(cin >> var )) ||(var < 1)|| (var > 10 ) || !(ceilf(var) == var) )
    {
        cout << "U nuts .. It can only be [1,10]\n";
        cin.clear();
        cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
        cout << "Enter a number (Integer between 1 to 10) : ";
        }

    cout << "\nYou entered : " << var;

   return 0;
}

这符合我的目的。但是我想知道的是,从float到int的转换有什么方法 - 我可以抑制它或者它可以将它显示为错误输入。

类似于cin >> var,其中var类型为int - 如果我们输入char,则返回false条件。我们可以为float条目实现相同的目标吗?

谢谢

2 个答案:

答案 0 :(得分:6)

  

但是如果用户输入9.5,则通过将float 9.5转换为9并将其存储在var。

中来接受它

不,不。如果用户输入9.5,则cin >> var会在点击.时停止阅读(并将其保留在流中)。没有浮点到空转换,因为您还没有读过float,只读int

修复是读取输入的其余部分(在cin >> var之后),并确保在int结束后没有遗留任何错误。

答案 1 :(得分:1)

如果要验证所有输入,则必须先获得整行。

尝试:

string line;
getline(cin, line); // gets whole line
char *endptr;
long int var = strtol(line.c_str(), &endptr, 10); // converts string to int

// now check that endptr points to end of the string
if (endptr<line.c_str()+line.length()) {
  // extra characters found after the integer
}