• 6643阅读
  • 1回复

如何覆盖qt的全局函数? [复制链接]

上一主题 下一主题
离线sharkoasis
 

只看楼主 倒序阅读 楼主  发表于: 2007-12-30
— 本帖被 XChinux 执行加亮操作(2008-07-17) —
  1. #include <QList>
  2. #include <QString>
  3. #include <QFile>
  4. #include <QDataStream>
  5. #include <QtDebug>
  6. #include <stdio.h>
  7. namespace aaa{
  8. template <typename T>
  9. QDataStream& operator<<(QDataStream& s, const QList<T>& l)
  10. {
  11.     s << quint32(l.size());
  12.     for (int i = 0; i < l.size(); ++i)
  13.         s << l.at(i)<<" ";
  14.     return s;
  15. }
  16. }
  17. void fillAndPrint()
  18. {
  19.   QList<QString> list;
  20.   list << "foo" << "bar" << "baz";
  21. //  using namespace aaa;
  22.   using aaa::operator<<;
  23.   QFile file1;
  24.   file1.open(stdout,QIODevice::WriteOnly);
  25.   QDataStream out1(&file1);
  26.   out1<<list;
  27.   QFile file("file.out");
  28.   file.open(QIODevice::WriteOnly);
  29.   QDataStream out(&file);
  30.   out<<list;
  31.   QString s;
  32.   foreach( s, list )
  33.     qDebug() << s;
  34. }
  35. int main( void )
  36. {
  37.   qDebug() << "Fill and print";
  38.   fillAndPrint();
  39.   return 0;
  40. }


大家看看这段代码,刚才看书的时候想到的问题:
我想输出一个qlist中所有的值,不想用foreach( s, list )这中方法,然后查看qlist类,找到
QDataStream & operator<< ( QDataStream & out, const QList<T> & list )方法,
用此方法输出,发现输出的节点间没有分隔符,于是想自己写的operator<<覆盖系统的,经过查看qt4的源码,发现operator<<是个全局函数!这就让我犯了难,经过思考,只能用名字空间来解决这个问题,上面的程序问题已经解决,但是名字空间无法取消,会影响illAndPrint()中的其他operator<<方法!
请问:
1.名字空间能否取消,或者将名字空间中的函数只用于部分代码中?
2.有没有更好的方法实现我上面的功能?替换全局函数
离线foxyz

只看该作者 1楼 发表于: 2008-01-02
用函数子吧。也就是用类封装你改写的operator
快速回复
限100 字节
 
上一个 下一个