C++ 使用模板从不同cin的用户处获取值

C++ 使用模板从不同cin的用户处获取值,c++,templates,C++,Templates,我必须创建所需的函数模板提示符,它显示提供的字符串,然后返回模板类型的值。最后,添加一行,该行使用字符串“What is answer?”(注意尾随空格)调用此函数,并将此答案存储在所提供结构的misc字段中 我不知道我在做什么,请帮忙 #include <string> #include <iostream> using std::string; struct Answers { string name; float answer; int m

我必须创建所需的函数模板提示符,它显示提供的字符串,然后返回模板类型的值。最后,添加一行,该行使用字符串“What is answer?”(注意尾随空格)调用此函数,并将此答案存储在所提供结构的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;
}
#包括
#包括
使用std::string;
结构答案{
字符串名;
浮动答案;
国际杂项;
};
//在此处编写模板函数“提示”
**模板
无效提示(字符串提示\u问题、T和答案)
{
prompt_question=“答案是什么?”;
cin>>答案;
杂项=答案;
}**
//我应该写什么?
int main(int argc,char*argv[])
{
**使用名称空间std;
答案信息{
提示(“你叫什么名字?”),
提示(argv[2]),
};**

可以IMHO,那次OP的尝试没有那么幸运

我试着整理一下:

  • 模板提示(字符串提示\u问题)

    这是错误的。缺少函数的标识符。或者,可能是缺少函数的返回类型,但函数的名称与模板参数的标识符相同

  • 提示\u问题=答案;

    这有什么用?
    answer
    未在此范围内声明或初始化。
    为什么要用它覆盖问题提示

  • answer=“答案是什么?

    这有什么用?

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


    编辑后,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";
    }
    

    比较第一种和第二种方法,您会注意到第二种方法的设计弱点:

    在第一种方法中,类型可以由编译器推断,而在第二种方法中,这是不可能的。第二种
    template
    function
    prompt()的模板实例的唯一区别是
    将是返回类型–编译器无法推断。因此,第二个模板函数必须始终与显式模板参数一起使用(这会带来另一个出错的机会)


    一般性建议:

    当您尝试编写
    模板
    函数时,如果您对模板不确定,则从普通函数开始,然后为类型编写
    类型定义
    ,该类型将成为模板参数:

    typedef std::string T;
    
    void prompt(const std::string &question, T &answer)
    {
      std::cout << question;
      std::cin >> answer;
    }
    
    typedef std::string T;
    无效提示(常量标准::字符串和问题,T和答案)
    {
    std::cout>答案;
    }
    
    编译、测试、欣赏、完成

    现在,可以将其转换为模板函数:

    //typedef std::string T; // obsolete
    template <class T>
    void prompt(const std::string &question, T &answer)
    {
      std::cout << question;
      std::cin >> answer;
    }
    
    //typedef std::string T;//过时
    模板
    无效提示(常量标准::字符串和问题,T和答案)
    {
    std::cout>答案;
    }
    

    编译、测试、欣赏、完成。

    IMHO,OP的尝试并没有这么幸运

    我试着整理一下:

  • 模板提示(字符串提示\u问题)

    这是错误的。缺少函数的标识符。或者,可能是缺少函数的返回类型,但函数的名称与模板参数的标识符相同

  • 提示\u问题=答案;

    这有什么用?
    answer
    未在此范围内声明或初始化。
    为什么要用它覆盖问题提示

  • answer=“答案是什么?

    这有什么用?

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


    编辑后,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";
    }
    

    比较第一种和第二种方法,您会注意到第二种方法的设计弱点:

    在第一种方法中,类型可以由编译器推断,而在第二种方法中,这是不可能的。第二种
    template
    function
    prompt()的模板实例的唯一区别是
    将是返回类型–编译器无法推断。因此,第二个模板函数必须始终与显式模板参数一起使用(这会带来另一个出错的机会)


    一般性建议:

    当您尝试编写
    模板
    函数时,如果您对模板不确定,则从普通函数开始,然后为类型编写
    类型定义
    ,该类型将成为模板参数:

    typedef std::string T;
    
    void prompt(const std::string &question, T &answer)
    {
      std::cout << question;
      std::cin >> answer;
    }
    
    typedef std::string T;
    无效提示(常量标准::字符串和问题,T和答案)
    {
    std::cout>答案;
    }
    
    编译、测试、欣赏、完成

    现在,可以将其转换为模板函数:

    //typedef std::string T; // obsolete
    template <class T>
    void prompt(const std::string &question, T &answer)
    {
      std::cout << question;
      std::cin >> answer;
    }
    
    //typedef std::string T;//过时
    模板
    无效提示(常量标准::字符串和问题,T和答案)
    {
    std::cout>答案;
    }
    

    编译、测试、欣赏、完成。

    如果我理解正确,您可以使用运算符>>重载:

    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;
    }
    
    struct animalnamesponse
    {
    std::字符串animalName;
    };
    std::istream&operator>>(std::istream&in,AnimalNameAnswer&ana)
    {
    返回>>ana.animalName;
    }
    结构CarSpeedAnswer
    {
    英里/小时;
    };
    std::istream&operator>>(std::istream&in、CarSpeedAnswer&csa)
    {
    返回>>cas.MPH;
    }
    模板
    无效提示(回答&a)
    {
    std::cout a;
    }
    
    如果我理解正确,您可以使用运算符>>重载:

    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;
    }
    
    struct animalnamesponse
    {
    std::字符串animalName;
    };
    std::istream&operator>>(std::istream&in,AnimalNameAnswer&ana)
    {
    返回>>ana.animalName;
    }
    结构CarSpeedAnswer
    {
    英里/小时;
    };
    std::istream&operator>>(std::istream&in、CarSpeedAnswer&csa)
    {
    复述