Проверьте, является ли объект 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++ ржавый.