我希望能够创建一个函数GetInput()
,它将一个类作为参数,并返回输入的内容。函数定义如下所示:
GetInput(class type) {
if (type == string) {
string stringInput;
cin >> stringInput;
return stringInput;
}
else if (type == int) {
int intInput;
cin >> intInput;
return intInput;
}
else {
return NULL;
}
}
我不知道为函数的返回类型写什么,因为它可以是string或int。如何使这个功能起作用?
答案 0 :(得分:7)
您无法将其作为实际参数,但您可以通过创建函数模板(也称为模板函数)来执行类似操作:
template<class T>
T GetInput() {
T input;
cin >> input;
return input;
}
你可以像这样使用它:
string stringInput = getInput<string>();
int intInput = getInput<int>();
getInput<string>
和getInput<int>
被认为是由编译器生成的不同函数 - 因此将其称为模板。
注意 - 如果您使用多个文件,则整个模板定义必须放在头文件而不是源文件中,因为编译器需要查看整个模板才能从中生成函数。
答案 1 :(得分:0)
正如你所描述的那样,你无法让它发挥作用。
但是,由于调用者需要知道正在读取什么类型,因此简单的解决方案是使用模板化函数。
#include <iostream>
// it is inadvisable to employ "using namespace std" here
template<class T> T GetInput()
{
T Input;
std::cin >> Input;
return Input;
}
并使用
// preceding code that defines GetInput() visible to compiler here
int main()
{
int xin = GetInput<int>();
std::string sin = GetInput<std::string>();
}
模板化函数适用于任何类型T
,其输入流(如std::cin
)支持流式传输,并且可以按值返回。您可以使用各种技术(特征,部分特化)来强制执行约束(例如,如果函数用于函数逻辑不起作用的类型,则会产生有意义的编译错误),或者为不同类型提供不同的功能。
当然,既然您所做的只是从std::cin
阅读,您实际上可以直接阅读
#include <iostream>
int main()
{
int xin;
std::string sin;
std::cin >> xin;
std::cin >> sin;
}