Различные типы ввода с использованием функции шаблона - PullRequest
3 голосов
/ 17 сентября 2011

Я пытаюсь получить ввод от пользователя с помощью шаблонной функции. Я хочу иметь возможность вводить int, double, float и string. Итак, вот код, который у меня есть:

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;
}

Все основные типы работают, но у меня проблема с вводом string s. Я хотел бы иметь возможность вводить более одного слова, но факт, что я использую cin, не могу. Так можно ли вводить многословные строки, а также базовые типы так, как я это делаю?

Ответы [ 4 ]

2 голосов
/ 17 сентября 2011

Я думаю, что вы все равно хотите использовать getline, так как вы не хотите оставлять вещи в буфере ввода после каждого запроса. Чтобы изменить поведение только для строк, вы можете использовать специализацию шаблона. После функции вашего шаблона:

template<>
void getInput(string prompt, string& inputVar)
{
    cout << prompt;
    getline(cin, inputVar);
}
2 голосов
/ 17 сентября 2011

Перегрузить функцию для string (или выполнить template специализацию).

void getInput(string prompt, string& inputVar) // <--- overloaded for 'string'
{
    cout << prompt;
    getline(cin, inputVar);  //<-- special treatment for 'string' using getline()
}
1 голос
/ 17 сентября 2011

Полагаю, вам понадобятся строки для особых случаев. cin получит только одно слово, и вам нужно будет получить всю строку, используя getline(). См. эту страницу для справки. Затем вы можете манипулировать линией так, как считаете нужным: разбить ее, проанализировать и еще много чего.

К сожалению, это забивает всю строку, и если у вас есть что-то вроде "one two three 123 3.1415", то вся строка будет израсходована.

Также см. Пример здесь для лучшего способа выбора между числами / строками / словами / числами. Но это не использует шаблоны в полной мере.

0 голосов
/ 17 сентября 2011

То, как это написано, может привести к неожиданным результатам.Например, у вас может быть сеанс, который выглядит так:

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

Я знаю, что вы только что привели пример, но это почти наверняка не то, что вы хотите сделать.cin никогда не зарегистрирует какой-либо ввод до тех пор, пока не будет нажата кнопка ввода, поэтому, возможно, вы все равно захотите идти построчно, используя getline.В противном случае все станет так, как описано выше.

Даже если бы у вас был доступ к каждому нажатию клавиши, вы, вероятно, не могли бы выполнить это в строке, как кажется, вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...