上周,我为一个作业创建了一个用于复数的类,我们的下一个作业是将该类修改为模板类。分配的一部分工作是重载提取运算符,最初只在处理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
是什么类型的“正确”方法(或者可能只是检查类型具有什么属性,因为您可能不需要区分int
和long
)是使用type traits。但是,对于具有不同类型的完全不同的实现,应使用不同的实现,因此声明一个采用
MyComplex<double>
的方法,采用MyComplex<int>
的方法等。关于c++ - 是否有类似于stoi的功能可用于模板类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58791169/