上周,我为一个作业创建了一个用于复数的类,我们的下一个作业是将该类修改为模板类。分配的一部分工作是重载提取运算符,最初只在处理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)是使用type traits

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

关于c++ - 是否有类似于stoi的功能可用于模板类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58791169/

10-11 00:27