c++ - 知道将哪个ostream传递给函数c++

标签 c++ overloading cout ostream

<分区>

我有一个我正在编写的函数,如果它通过文件流与通过控制台输出,它应该以不同的方式处理输出。 我可以编写两个函数,一个处理 cout,一个处理 fstream,然后将它们放入一个 if 语句中以确定调用哪个函数,或者可以添加一个 bool 值来确定要运行的版本,但验证在我看来,输出传递给函数。我的第一次尝试是

    void print(unsigned long long exp, unsigned long long* total, 
    ostream& out, unsigned long long min, unsigned long long max, unsigned 
    long long length)
    {
        if (out == cout)
    ...
    }

有没有办法重载 == 来比较这些或比较这些的函数?

最佳答案

根据您的评论,这是一个 XY 问题——您确实遇到了一个完全不同的问题(当输出到控制台而不是文件时对输出有特殊格式)并且认为最好通过识别 ostream 来完成.

更好的方法是分配一个自定义格式标志供您使用,然后在 cout 中设置该标志。然后你的打印例程检查标志:

class CustomFlag {
    static int flag_id = -1;
public:
    static std::ios_base &set(std::ios_base &s) {
        if (flag_id < 0) flag_id = s.xalloc();
        s.iword(flag_id) = 1;
        return s; }
    static std::ios_base &clear(std::ios_base &s) {
        if (flag_id < 0) flag_id = s.xalloc();
        s.iword(flag_id) = 0;
        return s; }
    static int get(std::ios_base &s) {
        if (flag_id < 0) flag_id = s.xalloc();
        return s.iword(flag_id); }
};

你做 std::cout << CustomFlag::set;将其设置在标准输出上,并使用 CustomFlag::get(stream)检查任何 ostream 上的标志。

通过这种方式,您可以控制任何 ostream 上的格式设置——包括将“控制台”格式设置为文件(用于测试)。如果您调用 copyfmt,它也会在流之间正确复制

关于c++ - 知道将哪个ostream传递给函数c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52635287/

相关文章:

c++ - QThread 中的槽和信号

c++ - 将 JsonCPP ValueIterator 与 STL 算法结合使用

c++ - 如何将父类转换为子类

c++ - 如何在cmake中添加链接器目录?

c++ - 模板参数的隐式转换规则

java - 这个函数是调用自身还是调用重载?

c++ - 使用隐式可转换对象调用 move 重载函数时出现编译错误

c++ - 格式化表 - 为什么 '\t' 会发生变化?

C++ 做它想做的事 | Char[] cout 和 inverted char[]

c++11 和 boost_filesystem cout 和 printf 不起作用