Есть ли функция, похожая на Stoi, которая будет работать для класса шаблона? - PullRequest
0 голосов
/ 10 ноября 2019

Я создал класс для комплексных чисел для назначения на прошлой неделе, и наше следующее назначение - изменить этот класс на класс шаблона. Частью назначения была перегрузка оператора извлечения, и первоначально, когда имел дело только с int, я взял всю строку ввода как строку и сделал подстроки для вещественных и мнимых частей, затем я использовал стои для преобразования частей в целые, которые я могмагазин (это то, что мой профессор предложил делать). Однако теперь, когда это шаблонный класс, он больше не работает, если используется тип double, float и т. Д. Есть ли функция, которая работает аналогично, но для разных типов? Или, возможно, другое решение, которое может работать лучше?

Я попытался использовать операторы if, чтобы определить, какой тип используется, а затем, соответственно, использовать стои, стод и т. Д., Однако это кажется не идеальным, поскольку он работает только для типов, которые я явно определяю, и яуверен, что это не то, что они ищут.

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.
}

Я пропустил то, что находится в скобках, потому что это очень долго и не меняет того факта, что я могу определить только для конечного количества данныхтипы. Заранее благодарю за любую помощь!

1 Ответ

2 голосов
/ 10 ноября 2019

Я бы рекомендовал использовать входной поток напрямую. Кажется, что ваш формат ввода 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), это использовать черты типа .

Но для того, чтобы иметь совершенно разные реализации для разных типов, вы должны использовать разныереализации, поэтому объявите метод, который принимает MyComplex<double>, метод, который принимает MyComplex<int> и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...