我试图从用户那里获取输入,并且用户有多种选择来输入不同类型的输入(char,int float)。根据输入的值,我必须采取适当的行动。
例如。我有一个功能如下: -
int* function(int data)
{
int a[50];
int k = 0;
a[k] = data;
k++;
// I want to make choice generalized so that it can accept both type of
// values int as well as char.
cout<<"\n Enter integer element to insert into array, otherwise press 'n' to terminate array list: ";
cin>>choice;
if(choice != 'n')
function(choice);
return a;
}
所以,在上面的例子中,我想做出选择。我如何使用模板的功能和类,但我想为变量做这个。请帮忙。
注意:上面的代码只是举例说明我的问题。
感谢&#39; S
答案 0 :(得分:0)
模板是一个编译时构造,因此无法让用户输入对模板类型产生影响。
您可以做的是输入转换的一些基于模板的自动化,您可以决定应该检查哪些模板实例化。假设您有一个类来处理名为GenericInput
的输入转换,其中包含模板函数bool GenericInput::CanConvert<TargetType>()
和TargetType GenericInput::Convert<TargetType>()
GenericInput in;
std::cin >> in;
if (in.CanConvert<int>()) {
// some action
}
else if (in.CanConvert<char>()) {
// another action
}
// ...
它基本上是这个想法的包装器,首先读取字符串,然后检查字符串是如何解释的。
要实现它,您需要以下内容:
重载operator >>
std::istream& operator >>(std::istream& stream, GenericInput& element) {
/* TODO: read input into string member of GenericInput object */
return stream;
}
GenericInput
班
class GenericInput {
private:
std::string _inputElement; // store input as base for conversion
public:
// TODO: standard class implementation
template <typename TargetType>
bool CanConvert() {
// TODO: create std::stringstream from _inputElement and try to read into a TargetType variable
// return true if the stringstream is valid after the read
}
template <typename TargetType>
TargetType Convert() {
// TODO: create std::stringstream from _inputElement and try to read into a TargetType variable
// return variable if the stringstream is valid after the read, otherwise report error
}
}
关于读取后的“有效”字符串流,检查两件事情可能很重要:如果字符串流处于某种错误状态,则转换失败。如果字符串流中有未读字符,则转换不完整,这也可能算作失败。
请不要指望这个开箱即用,它更像是一个想法,而不是实际的实现。