Получить значения от пользователя из другого CIN с помощью шаблона - PullRequest
0 голосов
/ 21 ноября 2019

Мне нужно создать запрос на шаблон требуемой функции, который отображает предоставленную строку и затем возвращает значение шаблонного типа. Наконец, добавьте строку, которая вызывает эту функцию со строкой «Каков ответ?» (Обратите внимание на завершающий пробел) и сохраните этот ответ в поле misc предоставленной структуры.

Я понятия не имею, что яЯ делаю, пожалуйста, помогите!

#include <string>
#include <iostream>
using std::string;

struct Answers {
    string name;
    float answer;
    int misc;
};

// write template function "prompt" here
**template <class T>
 void prompt(string prompt_question, T& answer)
{
  prompt_question = "What is the answer? ";
  cin >> answer;
  misc = answer;
}**
// what should I have written? 

int main(int argc, char* argv[])
{
    **using namespace std;
    Answers info {
        prompt<string>("What is your name? "),
        prompt<float>(argv[2]),
    };**
    cout << '\n' << "Who: " << info.name;
    cout << '\n' << "Knowledge: " << info .answer;
    cout << '\n' << "Wisdom: " << info.misc;
    return 0;
}

Я чувствую себя глупо из-за того, что не знаю, как решить эту проблему, пытаюсь понять это с 7-го века.

Ответы [ 2 ]

2 голосов
/ 21 ноября 2019

ИМХО, что попытка ОП не была такой удачной.

Я пытаюсь разобраться:

  1. template <class prompt> prompt(string prompt_question)Это сломано. Идентификатор функции отсутствует. Или, может быть, возвращаемый тип функции отсутствует, но тогда имя функции совпадает с идентификатором параметра шаблона.

  2. prompt_question = answer;? Для чего это будет хорошо? answer не объявлено в этой области и не инициализировано. Почему prompt_question должно быть заменено этим?

  3. answer = "What is the answer?? Для чего это будет хорошо?

  4. misc = answer;? Для чего это будет хорошо? misc не объявлено в этой области.

Мой рабочий пример, чтобы показать, как это может выглядеть:

#include <cassert>
#include <iostream>

struct Answers {
    std::string name;
    float answer;
    int misc;
};

template <class T>
void prompt(const std::string &question, T &answer)
{
  std::cout << question;
  std::cin >> answer;
}

int main()
{
  Answers info { };
  prompt("Who: ", info.name);
  if (!std::cin) { std::cerr << "Input failed!\n"; return -1; }
  prompt("Age: ", info.answer);
  if (!std::cin) { std::cerr << "Input failed!\n"; return -1; }
  std::cout << "\nYou claim to be " << info.name << " with an age of " << info.answer << ".\n";
}

Вывод:

Who: Just
Age: 34

You claim to be Just with an age of 34.

Демонстрация в реальном времени на coliru


После редактирования кажется, что OP требует, чтобы параметр шаблона имел тип возвращаемого значения:

#include <cassert>
#include <iostream>

struct Answers {
    std::string name;
    float answer;
    int misc;
};

template <class T>
T prompt(const std::string &question)
{
  std::cout << question;
  T answer;
  std::cin >> answer;
  return answer;
}

int main(int argc, char **argv)
{
  Answers info {
    prompt<std::string>("Who: "),
    prompt<float>("Age: ")
  };
  if (!std::cin) { std::cerr << "Input failed!\n"; return -1; }
  std::cout << "\nYou claim to be " << info.name << " with an age of " << info.answer << ".\n";
}

Вывод:

Who: Just
Age: 34

You claim to be Just with an age of 34.

Живая демоверсия на coliru

Сравнивая первый и второй подход, вы заметите конструктивную слабостьвторое:

Хотя в первом подходе тип может быть определен компилятором, это невозможно во втором. Единственным отличием экземпляров шаблона второй template функции prompt() будет тип возвращаемого значения - не выводимый для компилятора. Следовательно, вторая шаблонная функция должна использоваться всегда с явным параметром шаблона (который предоставляет другую возможность сделать что-то не так).


Общая рекомендация:

Когда вы пытаетесь написатьtemplate функция, и вы не уверены в шаблонах, затем начинаете с простой функции, а typedef для типа, который должен стать параметром шаблона:

typedef std::string T;

void prompt(const std::string &question, T &answer)
{
  std::cout << question;
  std::cin >> answer;
}

Компиляция, тестирование, восхищение, готово.

Теперь его можно превратить в функцию шаблона:

//typedef std::string T; // obsolete
template <class T>
void prompt(const std::string &question, T &answer)
{
  std::cout << question;
  std::cin >> answer;
}

Компиляция, тестирование, восхищение, готово.

0 голосов
/ 21 ноября 2019

Если я правильно понимаю, вы можете использовать оператор >> перегрузка:

struct AnimalNameAnswer
{
    std::string animalName;
};

std::istream& operator>>(std::istream& in, AnimalNameAnswer& ana)
{
    return in >> ana.animalName;
}

struct CarSpeedAnswer
{
    int MPH;
};

std::istream& operator>>(std::istream& in, CarSpeedAnswer& csa)
{
    return in >> cas.MPH;
}

template<class ANSWER>
void prompt(ANSWER& a)
{
    std::cout << "Enter answer:" << std::endl;
    std::cin >> a;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...