2013-04-29 4 views
11

Il est logique de mettre en œuvre < < pour QString comme:opérateur << pour QString

std::ostream& operator <<(std::ostream &stream,const QString &str) 
{ 
    stream << str.toAscii().constData(); //or: stream << str.toStdString(); //?? 
    return stream; 
} 

au lieu d'écrire

stream << str.toAscii().constData(); 

chaque fois dans le code.

Cependant, comme ce n'est pas dans la bibliothèque Qt standard, je suppose qu'il y a une raison particulière de ne pas le faire. Quels sont les risques/inconvénients de la surcharge < < comme spécifié ci-dessus?

+1

Je ne vois pas pourquoi il est logique d'utiliser str.toAscii() au lieu de toLatin1() ou toUtf8() ou toLocal8Bit()? – fjardon

+0

@fjardon - il n'y a pas de raison particulière :) N'importe lequel de ceux que vous avez mentionnés je pense travaillerait. –

+1

Ils font des choses très différentes en dehors des chaînes propres de 7 bits. – Yakk

Répondre

8

Si l'opérateur << est inclus dans la bibliothèque Qt, chaque client de la bibliothèque devra utiliser exactement la même implémentation. Mais en raison de la nature de QString, il est loin d'être évident que c'est ce que veulent ces clients. Certaines personnes écrivant un logiciel interagissant avec un ancien fichier en Europe occidentale peuvent vouloir utiliser des caractères Latin1(), les utilisateurs américains peuvent utiliser Ascii() et des logiciels plus modernes utiliser Utf8(). Une seule implémentation dans la bibliothèque limiterait de manière inacceptable ce qui peut être fait avec toute la bibliothèque.

+0

Merci, je suppose que cela a du sens - je le prends car ce n'est pas la largeur du bit qui ne peut pas être compris, mais la même largeur de bits peut être traitée différemment selon le texte sous-jacent que représente QString. Cependant, il est sûr de fournir sa propre implémentation pour << savoir à quoi sert l'encodage des caractères, n'est-ce pas? –

+0

Oui, si vous savez que vous ne traiterez qu'avec Ascii, vous pouvez créer votre propre opérateur. – fjardon

1

Je ne pense pas qu'il y ait une raison particulière pour exclure (ni inclure) cela dans le Qt library. Seul le problème qui pourrait éventuellement apparaître ici est une possibilité que l'objet std::ostream puisse modifier le contenu du paramètre passé à la fonction std::ostream::operator<<.

Cependant, dans le reference il est clairement indiqué que cette fonction va modifier le paramètre si le tampon de chaîne est passé - il n'y a rien sur les autres types, donc je suppose (et le bon sens me dit) cet opérateur < < ne modifiera pas le paramètre char*. En outre, sur this page il n'y a rien sur la modification de l'objet passé. Dernière chose: au lieu d'utiliser QString::toAscii().constData(), vous pouvez utiliser macro QString::toStdString() ou qPrintable(const QString&).

4

Il est pas nécessaire de mettre en œuvre une telle chose, tant qu'il existe une solution pratique comme celui-ci, impliquant QTextStream

QString s; 
QTextStream out(&s); 
s << "Text 1"; 
s << "Text 2"; 
s << "And so on...."; 

QTextStream est tout à fait ... powerfull

+1

... à moins que l'interface avec laquelle vous devez travailler nécessite un 'std :: ostream' bien sûr. – boycy

1

The accepted answer souligne des raisons valables pour pourquoi il n'y a pas de operator<< fonction pour QString.

On peut facilement surmonter ces raisons en fournissant certaines fonctions de commodité et en maintenant un certain état dans une application spécifique namespace.

#include <iostream> 
#include <QString> 

namespace MyApp 
{ 
    typedef char const* (*QStringInsertFunction)(QString const& s); 

    char const* use_toAscii(QString const& s) 
    { 
     return s.toAscii().constData(); 
    } 

    char const* use_toUtf8(QString const& s) 
    { 
     return s.toUtf8().constData(); 
    } 

    char const* use_toLatin1(QString const& s) 
    { 
     return s.toLatin1().constData(); 
    } 

    // Default function to use to insert a QString. 
    QStringInsertFunction insertFunction = use_toAscii; 

    std::ostream& operator<<(std::ostream& out, QStringInsertFunction fun) 
    { 
     insertFunction = fun; 
     return out; 
    } 

    std::ostream& operator<<(std::ostream& out, QString const& s) 
    { 
     return out << insertFunction(s); 
    } 
}; 

int main() 
{ 
    using namespace MyApp; 

    QString testQ("test-string"); 

    std::cout << use_toAscii << testQ << std::endl; 
    std::cout << use_toUtf8 << testQ << std::endl; 
    std::cout << use_toLatin1 << testQ << std::endl; 

    return 0; 
} 

Sortie:

test-string 
test-string 
test-string