Создать строковую переменную и запросить ввод в той же строке? - PullRequest
0 голосов
/ 01 марта 2019

Я абсолютно ненавижу эти ненужные шаги в программировании, когда вы объявляете и присваиваете переменную в одной строке и запрашиваете ввод в следующей.

Для краткости я хочу создать переменную и попроситьвведите все в одной строке.

В настоящее время я пишу код следующим образом:

string name = "";
cout << "Please enter your name: ";
cin >> name; //Too many steps for no reason

Это моя цель:

string name = cin >> name

Очевидно, что эта строка делаетне работает в C ++ и не будет работать, если я закрою глаз и буду охотиться за ним.

Есть ли небольшая хитрость для этого?Я имею в виду возможность работы с циклами for при назначении массива, так почему бы не объявить и не назначить ввод в одну строку?

Я знаю, что читатель попытается выпрыгнуть из окна.goto доказал эту теорию и да, я использую ее с гордостью:)

Любая помощь приветствуется!

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Так в чем проблема?Если у вас есть повторяющийся код (любой ненужный раздражающий), вы просто заключаете его в функцию / метод:

template<typename T>
auto consoleInput(std::string_view request) -> T
{
    std::cin.sync();
    std::cout << request;
    T x;
    while(! (std::cin >> x)) {
        std::cin.clear();
        std::cin.ignore(200, '\n');
        std::cout << "\ntry again: " << request;
    }
    return x;
}

auto name = consoleInput<std::string>("Provide a name");

https://wandbox.org/permlink/iUWmrMCbCWGjoiGu

0 голосов
/ 01 марта 2019

да, я использую это с гордостью:)

Вы действительно не должны.Научитесь писать хорошую, легкую для чтения, небольшую функцию с простейшим потоком управления.Кроме того, <algorithm>.


Вы можете сделать это, переместив шаги для инициализации переменной в функцию:

template<typename T>
auto ask_user(std::string_view message) -> T {
    std::cout << message;
    T value;
    std::cin >> value;
    return value;
}

Теперь вы можете сделатьваши входы так:

int main() {
    auto name = ask_user<std::string>("What's your name? ");
}
0 голосов
/ 01 марта 2019

Вы можете попробовать написать шаблонную функцию, например,

template <typename T>
T read (std::istream & in = std::cin)
{
    T x; in >> x; return x;
}

и использовать ее как

 auto x = read<int>();

Если вы хотите проверить ввод пользователя (и вы почти наверняка do в реальном коде), вы можете использовать, например, std::optional:

template <typename T>
std::optional<T> read (std::istream & in = std::cin)
{
    T x; in >> x; return in ? x : std::nullopt;
}

template <typename T>
T read_loop (std::istream & in = std::cin)
{
    while (true)
    {
        auto input = read<T>(in);
        if (input) return *input;
        in.clear();
        std::cout << "try again: ";
    }
}
...