Проверьте, является ли объект ostream cout или ofstream, c++

есть ли способ в C++ проверить, если

4 ответов


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

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


вы определенно получите дальше, проверив идентификатор streambuffer

if (s.rdbuf() == std::cout.rdbuf())

это потому, что тривиально просто назначить потоки / псевдонимы буферам, см. http://www.cplusplus.com/reference/iostream/ios/rdbuf/ и книга Йосутти


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

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


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

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

Edit:

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

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