我想在c ++中重载输入操作符,以便我可以在新类型中正确替换输入,我有以下
struct{
uint64_t frac;
unit64_t exp;
};
我想要在frac中浮点之后和exp之前出现的内容。
请帮助!
答案 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
是按照当前问题以这种方式定义的。
派系元素应为double
或float
类型,然后才能使用std::atof