Использование функции шаблона для проверки общего ввода - PullRequest
0 голосов
/ 08 мая 2019

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

Итак, это моя попытка (которая выдает ошибку: 'input': необъявленный идентификатор)

using namespace std;

template <typename T>
T check_input(T model_input, string message)
{
    for (;;)
    {
        cout << message << endl;
        T input; // will it make the input type the same type as model input used in the arg?
        cin >> input;
        // if valid input then for loop breaks
        if (cin.fail())
        {
            // prompts that there was an error with the input and then loops again
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cout << "Invalid input, please try again" << endl;
        }
        else
        {
            break;
        }
    }
    return input; 
}

использование:

string model_type = "exp";
string exp_name = check_input(model_type, "Please enter the experiment name:");

Приведет ли неиспользуемый параметр модели к тому, что входная переменная будет того же типа? (также это плохая практика программирования иметь неиспользуемый параметр?)

Есть ли более элегантный способ написания общего цикла проверки?

РЕДАКТИРОВАТЬ: Почему ошибка необъявленного идентификатора происходит в строке с «return input;»?

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Вы возвращаете input за пределами области действия for, в то время как вы объявляете ее внутри.

Просто переместите декларацию за пределы цикла.

#include <iostream>
using namespace std;

template <typename T>
T check_input(T model_input, string message)
{
    T input; // will it make the input type the same type as model input used in the arg?
    for (;;)
    {
        cout << message << endl;
        cin >> input;
        // if valid input then for loop breaks
        if (cin.fail())
        {
            // prompts that there was an error with the input and then loops again
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cout << "Invalid input, please try again" << endl;
        }
        else
        {
            break;
        }
    }
    return input; 
}

int main () 
{
    string model_type = "exp";
    string exp_name = check_input(model_type, "Please enter the experiment name:");
}

Смотрите демо-версию здесь

0 голосов
/ 08 мая 2019

, который выдает ошибку: 'input': необъявленный идентификатор

Это потому, что input определено внутри цикла, но ваш код пытается использовать его снаружи (return input;).

Возможное исправление:

    for (;;)
    {
        cout << message << endl;
        T input;
        if (cin >> input) {
            return input;
        }
        // handle input errors
        ...
    }

Из-за наличия неиспользуемого параметра модели входная переменная будет одного типа?

Да.Существует только один параметр шаблона T, поэтому каждый экземпляр check_input будет использовать один и тот же тип для своего первого аргумента и возвращаемого значения.

Для определения типа шаблона будет использоваться тип первого аргумента для определенияT.

(также это плохая практика программирования иметь неиспользуемый параметр?)

Да.Вы можете просто опустить его и вызвать функцию как

auto exp_name = check_input<string>("Please enter the experiment name:");

Вместо того, чтобы полагаться на вывод типа из (в противном случае неиспользованного) аргумента, просто попросите пользователя передать тип напрямую.

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