为一个新的任意浮点数重载“cin”

时间:2013-11-27 18:05:23

标签: c++

我想在c ++中重载输入操作符,以便我可以在新类型中正确替换输入,我有以下

struct{
           uint64_t frac;
           unit64_t exp;

  };

我想要在frac中浮点之后和exp之前出现的内容。

请帮助!

4 个答案:

答案 0 :(得分:1)

尝试做这样的事情

struct Number               //Changed this because I don't know what you are looking for
{
    int frac;
    double exp;
};


istream& operator>>(istream& in, Number& number)
{
    double temp;
    in >> temp;
    number.frac = (int)temp;             //You need to calculate frac here not sure what you are looking for
    number.exp = temp - number.frac;     //Same for exp
    return in;
}

答案 1 :(得分:0)

假设您不知道如何实现用户定义类型的流输入,并且您要求该信息而不是要求某人为您编写自定义输入函数:

要重载您自己类型的输入操作,您只需在定义类型的同一命名空间中提供具有兼容签名的非成员operator>>

struct S {int i}; // type to read from input stream

std::istream &operator >> (std::istream &is, S &s) {
  // read from stream
  int i;
  is >> i;
  // check for errors, validate stream input, etc.
  // ...

  // return the input stream
  return i;
}

int main() {
    S s;
    std::cin >> s;
}

operator >>通常需要访问该类型的私有成员。您可以声明运营商是朋友。实际上,您可以同时定义非成员operator >>,它将被放入正确的命名空间中:

class C {
  int i;

  friend std::istream &operator >> (std::istream &is, S &s) {
    // ...
  }
};

答案 2 :(得分:0)

template <class Elem, class Tr>
std::basic_istream<Elem, Tr>& operator>>(std::basic_istream<Elem, Tr>& str,
    Number num) {
    char ch;
    return str >> num.exp >> ch >> num.frac;
}

然而,这是一种有点特殊的输入格式。通常小数点左边的数字是分数的一部分,这些数字的数量用于调整指数。

答案 3 :(得分:0)

您可以使用字符串输入数字,然后通过重载struct运算符来填充<<元素:

#include <iostream>
#include <string>

 struct Frac {
           unsigned long  frac; //uint64_t
           unsigned long exp;  //uint64_t
   friend std::istream& operator >>(std::istream& is, Frac &f)
   {
      std::string s;
      is >> s;
      std::size_t n = s.find(".");

      if (n != std::string::npos)
      {
         f.frac = std::atoll(s.substr(0,n).c_str());
         f.exp = std::atoll(s.substr(n+1).c_str());
      }
      else
      {
         f.frac = std::atoll(s.c_str());
         f.exp  = 0 ;
      }
   }
};

int main()
{
  Frac f;

  std::cin>>f;

  std::cout << f.frac <<" "<< f.exp;
}

请参阅HERE

修改:

以上将为1.23,1.230和1.023等输入提供相同的结果 因为struct是按照当前问题以这种方式定义的。

派系元素应为doublefloat类型,然后才能使用std::atof