我可以设置一个变量来在使用 cout 时更改 floatfield 吗?
Can I set a variable that will change the floatfield when using cout?
我希望能够根据条件轻松地将浮动字段从科学更改为固定,因此我的结果将从 3.000000e+00 更改为 3.0,使用的代码可能如下所示:
some_datatype floatfield;
float number = 5.894
if (condition) {
floatfield = 'scientific';
} else floatfield = 'fixed';
cout << "hello" << floatfield << number << endl;
我知道我可以使用
达到同样的效果
float number = 5.894
if (condition) {
cout << "hello" << scientific << number << endl;
} else cout << "hello" << fixed << number << endl;
但是如果我开始使用更多的流格式标志,这并不能很好地概括。
如果some_datatype
存在,它是什么?如果没有,是否有任何其他方法可以使用条件更改流格式标志?
我不确定我是否正确理解了问题,但这可能是一个解决方案:
#include <iostream>
using namespace std;
struct my_float {
float value_;
bool scientific_ = true;
my_float(float value) : value_(value) {}
void set_scientific() { scientific_ = true; }
void set_fixed() { scientific_ = false; }
};
ostream& operator<<(ostream& os, const my_float& f) {
if (f.scientific_)
return os << scientific << f.value_;
else
return os << fixed << f.value_;
}
int main() {
my_float number = 5.894;
bool condition = true; // <--- Change this!
if (condition) {
number.set_scientific();
}
else {
number.set_fixed();
}
cout << "hello" << number << endl;
return 0;
}
这当然很粗糙,class肯定可以更完整。
不要用它来存储很多浮点数,因为 id 很容易使你的内存需求加倍。
I/O 操纵符实际上是函数 (!),而您要在它们之间切换的操纵符恰好具有相同的签名。
因此,您可以使用函数指针来实现您的目标:
#include <iomanip>
#include <iostream>
int main()
{
using ManipFuncType = std::ios_base&(std::ios_base&);
const bool condition = true; // or false!
ManipFuncType* floatfield;
float number = 5.894;
if (condition)
floatfield = std::scientific;
else
floatfield = std::fixed;
std::cout << "hello" << floatfield << number << std::endl;
}
(live demo)
我希望能够根据条件轻松地将浮动字段从科学更改为固定,因此我的结果将从 3.000000e+00 更改为 3.0,使用的代码可能如下所示:
some_datatype floatfield;
float number = 5.894
if (condition) {
floatfield = 'scientific';
} else floatfield = 'fixed';
cout << "hello" << floatfield << number << endl;
我知道我可以使用
达到同样的效果float number = 5.894
if (condition) {
cout << "hello" << scientific << number << endl;
} else cout << "hello" << fixed << number << endl;
但是如果我开始使用更多的流格式标志,这并不能很好地概括。
如果some_datatype
存在,它是什么?如果没有,是否有任何其他方法可以使用条件更改流格式标志?
我不确定我是否正确理解了问题,但这可能是一个解决方案:
#include <iostream>
using namespace std;
struct my_float {
float value_;
bool scientific_ = true;
my_float(float value) : value_(value) {}
void set_scientific() { scientific_ = true; }
void set_fixed() { scientific_ = false; }
};
ostream& operator<<(ostream& os, const my_float& f) {
if (f.scientific_)
return os << scientific << f.value_;
else
return os << fixed << f.value_;
}
int main() {
my_float number = 5.894;
bool condition = true; // <--- Change this!
if (condition) {
number.set_scientific();
}
else {
number.set_fixed();
}
cout << "hello" << number << endl;
return 0;
}
这当然很粗糙,class肯定可以更完整。
不要用它来存储很多浮点数,因为 id 很容易使你的内存需求加倍。
I/O 操纵符实际上是函数 (!),而您要在它们之间切换的操纵符恰好具有相同的签名。
因此,您可以使用函数指针来实现您的目标:
#include <iomanip>
#include <iostream>
int main()
{
using ManipFuncType = std::ios_base&(std::ios_base&);
const bool condition = true; // or false!
ManipFuncType* floatfield;
float number = 5.894;
if (condition)
floatfield = std::scientific;
else
floatfield = std::fixed;
std::cout << "hello" << floatfield << number << std::endl;
}