Y a-t-il un moyen de vérifier si un objet quelque chose comme:
p> La raison pour laquelle je veux faire cela est que je veux surcharger l'opérateur est-il possible de simplement surcharger l'opérateur Mis à jour intention mieux. P> p> ostream code> est
COUT code> ou un
detream code> objet?
<<< / code> pour faire deux choses différentes selon le type de quel type de flux il est utilisé avec. p>
<<< / code> à chaque fois avec un type de flux différent? P>
4 Réponses :
Il est possible en vérifiant "l'identité" de la diffusion: Cependant, je doute sur l'utilité de ce test. Si votre fonction peut gérer n'importe quel flux de sortie, pourquoi vous soucier de ce que la flux utilise? P> if (& Out == & Cout) ... code>. p>
Pourquoi? Peut-être que d'écrire une chose à un fichier et une autre chose à un terminal. E.G., utilisez des séquences d'échappement pour coloriser la sortie lors de l'écriture sur un terminal. Bien que cela ne fonctionne pas si stdout est redirigé.
C'est peu probable de travailler tout le temps. Vous devez lancer des objets sur le même type avant de prendre leur adresse (dans ce cas, une forme de type de flux de base commun).
@Martin York: Est-ce que c'est le cas pour les arbres à un héritage, aussi?
@sehe: Je ne le savais pas. Que pouvez-vous faire dans cette affaire?
@sehe: BTW, qu'est-ce que est i> un tampon de flux aliasé? (CFR Stackoverflow.com/questions/5296484/.../ a>)
Je voulais dire rdbuf () partage / aliasing: voir ma propre réponse antérieure Stackoverflow.com/Questtions/3318714/...
Je envisage de changer la façon dont vous streamez sur l'objet que vous diffusez pour être une idée horrible qui ignore complètement l'ensemble de la manière dont les objets de flux sont destinés à travailler. Donc, je créerais une classe ou une fonction de membre qui renvoie un objet d'un type qui gère le flux différemment. Ainsi, par exemple, si vous vouliez fournir un flux coloré, vous appelez:
std::cout << myclass.colorstreamer << endl;
Pourriez-vous s'il vous plaît élaborer un peu plus sur la raison pour laquelle c'est une mauvaise idée et pourriez-vous être plus précis quant à la manière de vous approcher du problème de votre chemin?
@Jordan: édité pour répondre à vos questions, bien que je pense que le commentaire de Martin York sur votre question (c'est-à-dire "" tout le point d'utilisation des flux ... ") est un meilleur libellé pour la raison pour laquelle c'est une mauvaise idée.
Il ressemble à ce que vous voulez vraiment savoir, ce n'est pas si le flux est couteux, mais si le descripteur de fichier sous-jacent est attaché à un terminal? Si tel est le cas, vous avez besoin du descripteur de fichier sous-jacent. Malheureusement, vous ne pouvez pas l'obtenir d'un iostream. S'il est possible d'utiliser CSTDIO au lieu de iostream, vous le pouvez. Si vous avez le descripteur de fichier, déterminez si vous écrivez sur un terminal est simple comme voir si tcgetattr () renvoie -1. P>
Aussi, ne laissez personne vous dire de ne pas mettre en œuvre certaines fonctionnalités dont vous avez besoin parce qu'il ternit la pureté d'une abstraction fuite. Si vous avez vraiment besoin d'un comportement différent, alors faites ce que vous devez faire pour produire cette fonctionnalité. p>
Vous allez absolument aller plus loin en vérifiant l'identité de Streambuffer
if (s.rdbuf() == std::cout.rdbuf())
C'est donc ce que j'ai légèrement appelé «aliasing» un tampon de flux. Je suppose que ce n'était pas trop clair, alors j'ai édité mes commentaires pour être plus clair.
Pertinence: Stackoverflow.com/Questtions/366955/...
Quelle est votre motivation pour faire cela? Cela me semble une très mauvaise idée.
@Brian: J'ai ajouté ci-dessus, que je souhaite utiliser l'opérateur
<<< / code> pour effectuer deux choses différentes selon le flux, les approches alternatives sont accueillies.
@Jordan: Oui, je sais que vous voulez utiliser le
<<< / code> pour faire deux choses différentes selon le flux. Pourquoi veux-tu faire cela? Cela me semble une très mauvaise idée.
L'ensemble du point d'utilisation des flux est de le rendre anonyme pour la destination afin que tout ressemble à la même chose quel que soit le type de type que vous utilisez. Que se passe-t-il si quelqu'un connecte un flux de fichiers au descripteur de fichier 2 (la norme sur la plupart des systèmes). Ce serait un flux totalement différent, mais au système d'exploitation, il ira à une console. Alternativement, que si le système d'exploitation a accroché le STD :: Cout à un fichier, cela est si éloigné de l'espace d'application qu'il serait indétectable à l'intérieur de l'application.
Cela ressemble à votre vraie question pourrait être "Comment détecter si la sortie est à un terminal"?