C++ 使用模板从不同cin的用户处获取值
我必须创建所需的函数模板提示符,它显示提供的字符串,然后返回模板类型的值。最后,添加一行,该行使用字符串“What is answer?”(注意尾随空格)调用此函数,并将此答案存储在所提供结构的misc字段中 我不知道我在做什么,请帮忙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
#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
functionprompt()的模板实例的唯一区别是
将是返回类型–编译器无法推断。因此,第二个模板函数必须始终与显式模板参数一起使用(这会带来另一个出错的机会)
一般性建议:
当您尝试编写模板
函数时,如果您对模板不确定,则从普通函数开始,然后为类型编写类型定义
,该类型将成为模板参数:
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
functionprompt()的模板实例的唯一区别是
将是返回类型–编译器无法推断。因此,第二个模板函数必须始终与显式模板参数一起使用(这会带来另一个出错的机会)
一般性建议:
当您尝试编写模板
函数时,如果您对模板不确定,则从普通函数开始,然后为类型编写类型定义
,该类型将成为模板参数:
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)
{
复述