【问题标题】:Different types of input using template function使用模板函数的不同类型的输入
【发布时间】:2011-09-17 06:49:35
【问题描述】:

我正在尝试使用模板函数从用户那里获取输入。我希望能够输入 int、double、float 和字符串。所以这是我到目前为止的代码:

template<class DataType>
void getInput(string prompt, DataType& inputVar)
{
      cout << prompt;
      cin >> inputVar;
}

int main()
{
      string s;
      int i;
      float f;
      double d;

      getInput("String: ", s);
      getInput("Int: ", i);
      getInput("Float: ", f);
      getInput("Double: ", d);

      cout << s << ' ' << i << ' ' << f << ' ' << d << endl;
      return 0;
}

基本类型都可以,但我遇到的问题在于输入strings。我希望能够输入多个单词,但事实上我使用的是 cin 我不能。那么是否可以以类似于我正在做的方式输入多词字符串以及基本类型?

【问题讨论】:

  • 使用 cin.getline() 然后你可以在你的程序中拆分单词
  • 但是我会失去正确输入整数、浮点数和双精度数的能力?
  • 看我的回答,第二个链接可能有用。

标签: c++ templates input


【解决方案1】:

我认为无论如何您都想使用 getline,因为您不想在每次提示后将内容留在输入缓冲区中。但是,要仅更改字符串的行为,您可以使用模板特化。在你的模板函数之后:

template<>
void getInput(string prompt, string& inputVar)
{
    cout << prompt;
    getline(cin, inputVar);
}

【讨论】:

  • 删除了我的答案以支持这个。
  • 成功了。现在,C++ 处理模板特化与函数重载的方式有何不同?
  • @Jonhsyweb,最好选择overloading over specialization
【解决方案2】:

重载string 的函数(或做template 特化)。

void getInput(string prompt, string& inputVar) // <--- overloaded for 'string'
{
    cout << prompt;
    getline(cin, inputVar);  //<-- special treatment for 'string' using getline()
}

【讨论】:

    【解决方案3】:

    我相信您将需要特殊情况的字符串。 cin 只会得到一个单词,而您需要使用 getline() 得到整行。请参阅this page 以供参考。然后,您可以根据需要操作该行:拆分、解析等等。

    不幸的是,整条线路都被破坏了,如果你有类似"one two three 123 3.1415" 的东西,那么整条线路都会被消耗掉。

    另请参阅example here,了解在数字/字符串/单词/浮点数之间做出决定的更好方法。但这并没有充分利用模板。

    【讨论】:

      【解决方案4】:

      按照这种方式编写,您可能会得到一些可能出乎意料的结果。例如,你可以有一个这样的会话:

      String: Foo 12            3.14159  1.5 <enter>
      Int: Float: Double: Foo 12 3.14159 1.5
      

      我知道你只是举了一个例子,但这几乎肯定不是你想做的。 cin 在按下 enter 之前永远不会注册任何输入,因此您可能希望使用 getline 逐行进行。否则事情会变得像上面那样时髦。

      即使您可以访问每个按键,您也可能无法像您希望的那样完成此内联操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多