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

C++ 知道将哪个ostream传递给函数c++;,c++,overloading,cout,ostream,C++,Overloading,Cout,Ostream,我有一个我正在编写的函数,如果它被传递到一个文件流,与如果它被传递到控制台,它应该以不同的方式处理输出。 我可以编写两个函数,一个用于处理cout,一个用于处理fstream,然后将它们放入if语句中以确定调用哪个函数,或者可以在哪个版本上添加bool来运行,但在我看来,验证传递给函数的输出会更简单。我的第一次尝试是 void print(unsigned long long exp, unsigned long long* total, ostream& out, u

我有一个我正在编写的函数,如果它被传递到一个文件流,与如果它被传递到控制台,它应该以不同的方式处理输出。 我可以编写两个函数,一个用于处理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); }
};
class自定义标志{
静态int标志_id=-1;
公众:
静态std::ios\U基和集(std::ios\U基和集){
如果(flag_id<0)flag_id=s.xalloc();
s、 iword(flag_id)=1;
返回s;}
静态std::ios_base&clear(std::ios_base&s){
如果(flag_id<0)flag_id=s.xalloc();
s、 iword(flag_id)=0;
返回s;}
静态int-get(std::ios\u-base&s){
如果(flag_id<0)flag_id=s.xalloc();
返回s.iword(flag_id);}
};

听起来您可能需要两个子类,每个子类都有一个虚拟的“write()”方法。请注意,您不需要重载,只需比较指针-
if(&out==&cout)
是否必须根据流的不同进行不同的打印?这似乎违反直觉。如果你真的要让它与众不同,我会为
ostream&
of stream&
重载函数。“我有一个我正在编写的函数,如果它被传递到文件流,与如果它被传递到控制台时,应该以不同的方式处理输出。”然后编写两个函数。如果它应该做不同的事情,它应该是不同的函数,建议两个函数可能考虑如何根据流的运行时值来调度这些函数。