Проверьте, является ли объект ostream судом или ofstream, C++

Есть ли путь в C++, чтобы проверить если ostream объект cout или a ofstream объект?

Что-то как:

ostream& output(ostream& out)
{
    if (out == cout)
        return out;
    else
    {
        out << "something different because its not going to the console" << endl;
        return out;
    }
}

Причина я хочу сделать это, то, что я хочу перегрузиться << оператор, чтобы сделать две разных вещи в зависимости от того, с каким потоком это используется.

Действительно ли возможно, просто перегружаются << оператор дважды каждый раз с другим типом потока?

Обновленный для отражения намерения лучше.

8
задан Jordan 23 July 2010 в 14:03
поделиться

3 ответа

Это возможно, проверив «идентичность» потока: if (& out == & cout) ... .

Однако я сомневаюсь в полезности этого теста. Если ваша функция может обрабатывать любой выходной поток, зачем беспокоиться о том, какой поток она использует?

4
ответ дан 5 December 2019 в 08:50
поделиться

Я считаю, что изменение способа потоковой передачи на основе объекта, который вы транслируете, является ужасной идеей, которая полностью игнорирует всю суть того, как объекты потока предназначены для работы. Итак, я бы создал класс-член или функцию, которая возвращает объект типа, который по-разному обрабатывает поток. Так, например, если вы хотите предоставить раскрашенный поток, вы должны позвонить:

std::cout << myclass.colorstreamer << endl;

Edit:

Ваше предложение по обработке потоков - плохая идея, потому что вы не имеете ни малейшего представления о том, как другие люди будут использовать ваш код. Совершенно не интуитивно понятно, что поток ведет себя по-разному в зависимости от того, какой объект выполняет потоковую передачу. Я сравниваю это с функцией, которая возвращает другой результат в зависимости от того, кто ее вызвал, а не в зависимости от ее аргументов, хотя я признаю, что технически поток является аргументом.

Что касается того, как это сделать таким образом, один из способов - создать colorstreamer , сделать этот новый класс членом myclass и сделать myclass член colorstreamer , затем сделать оператор потока colorstreamer другом для myclass . Меня больше беспокоит семантика вызова функции (т.е. использование .colorstreamer для управления потоком, а не сам поток), чем то, как его реализовать. Мое предложение о том, как это реализовать, вполне возможно, плохой способ сделать это; мой C ++ заржавел.

1
ответ дан 5 December 2019 в 08:50
поделиться

Похоже, что на самом деле вы хотите узнать не то, является ли поток cout, а то, присоединен ли базовый дескриптор файла к терминалу? Если это так, то вам нужен базовый дескриптор файла. К сожалению, вы не можете получить его из iostream. Если есть возможность использовать cstdio вместо iostream, то можно. Если у вас есть дескриптор файла, определить, пишете ли вы в терминал, просто: посмотрите, возвращает ли tcgetattr() -1.

Кроме того, не позволяйте никому говорить вам, что вы не должны реализовывать некоторую функциональность, которая вам нужна, потому что это портит чистоту некоторой негерметичной абстракции. Если вам действительно нужно другое поведение, сделайте то, что вам нужно сделать для создания этой функциональности.

4
ответ дан 5 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: