有没有类似于stoi的函数可以用于模板类

Is there a function similar to stoi that would work for a template class?

本文关键字:用于 类似于 stoi 函数 有没有      更新时间:2023-10-16

我上周为一个作业创建了一个复数类,我们的下一个作业是将这个类修改为模板类。任务的一部分是重载提取运算符,最初只处理int时,我将整个输入行作为字符串,并为实数和虚数部分生成子字符串,然后我使用stoi将这些部分转换为可以存储的int(这是我的教授建议做的(。然而,现在这是一个模板类,如果使用的类型是double、float等,stoi就不再工作了。有没有一个函数可以类似地工作,但可以跨不同的类型?或者可能是另一种可能更好的解决方案?

我尝试使用if语句来检测正在使用的类型,然后使用stoi、stod等。然而,这似乎不太理想,因为它只适用于我明确定义的类型,我确信这不是他们想要的。

template <class T>
istream& operator>>(istream& in,MyComplex<T> &num){
string inString;
getline(in, inString);
T test = 3.33;
if(test != 3.33){
//convert using stoi
}
else if(test == 3.33){
//convert using stod
}
//etc.
}

我省略了括号内的内容,因为它很长,并且不会改变我只能为有限数量的数据类型定义的事实。提前感谢您的帮助!

我建议直接使用输入流。您的输入格式似乎是2.3 + 5i,因此您可以使用以下代码:

double a,b;
char c; 
in >> a >> c >> b; // c eats the +; let's the i in the in
in >> c; // eats the i

注意,我们也可以在同一行中使用c两次,我只是想为我的评论留出空间,所以我把它放在下一行。

代码的一个更一般的注释:检查T是什么类型(或者可能只是检查类型具有什么属性,因为你可能不需要区分intlong(的"正确"方法是使用类型特征。

但是,对于不同类型有完全不同的实现,您应该使用不同的实现。因此,声明一个采用MyComplex<double>的方法,一个采用MyComplex<int>的方法,等等。