知道哪个ostream传递给函数C ++

时间:2018-10-03 20:35:31

标签: 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)
    ...
    }

是否有一种方法可以重载==来比较它们或比较它们的函数?

1 个答案:

答案 0 :(得分:1)

根据您的评论,这是一个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

,它也将在流之间正确复制。