6

我发现自己经常使用包含非常小的数字范围(通常从 1 到 10)的变量,并且希望通过使用 char 数据类型而不是 int 甚至 short 来最小化我使用的内存量。我想将 cin 值添加到我的 char 变量中,而不需要 cin 将其转换为它的 ASCII 等价物并且不使用单引号。即,以下内容:

cout<< "Pick from 1 to 10.";

char selection;

cin>> selection;

if (selection == 1) return 1;

ETC...

有没有一种通用的方法来做到这一点?同样,我不想使用单引号。

谢谢

4

4 回答 4

4

你可以创建一个小实用函数:

struct CharReader {
  char &c;
  CharReader(char &c) : c(c) {}
};

CharReader asNumber(char &c) {
  return CharReader(c);
}

template <typename T, typename Traits>
std::basic_istream<T, Traits>& operator>> (std::basic_istream<T, Traits> &str, const CharReader &c) {
  short i;
  str >> i;
  c.c = static_cast<char>(i);
  return str;
}

你可以像这样使用它:

char selection;
std::cin >> asNumber(selection);
于 2013-04-22T07:09:41.507 回答
3

保存三个字节(或零,因为编译器很可能无论如何都会对齐堆栈......)并使您的代码复杂化以读取数字是没有意义的。只需正常进行并将节省内存的工作放在重要的地方(如果您不知道重要的地方,那可能没关系)。

int selection;
if(!(cin >> selection) || selection < 0 || selection > 10) {
    // hmmm do something about it; perhaps scold the user.
}
place_where_it_is_getting_stored = selection;
于 2013-04-22T07:05:25.180 回答
1
char selection;
cin >> selection;
selection -= '0';
于 2013-04-22T07:02:02.103 回答
-1

也许你应该试试

if (selection - '0' == 1) return 1;

这是根据您的情况最简单的方法

于 2013-04-22T06:58:24.020 回答