我可以设置一个变量来在使用 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)