[ glorius @ 23.12.2011. 16:05 ] @
Svideo mi se nacin kako Qt insertuje objekat u listu pomocu operatora << pa sam taj nacin poceo da koristim i sa STL kontejnerima tako sto sam dodao funkcionalnost za operator <<: Code: template <typename T> class MyList : public std::list<T> { public: MyList& operator << (const T& elem); }; template <typename T> MyList<T>& MyList<T>::operator <<(const T &elem) { push_back(elem); return *this; } Tako da se sada lista moze popunjavati na sledeci nacin: Code: MyList<std::string> data; data << "Jedan"; data << "Dva"; data << "Tri"; Kasnije sam uvideo da postoji bolji nacin gledajuci operator << za ostream koji mi je dao ideju: Code: template <typename T> std::list<T>& operator << (std::list<T>& list, const T& elem) { list.push_back(elem); return list; } Ovo "magicno" dodaje funkcionalnost klasi std::list da koristi operator << kao u Qt-u. Code: std::list<std::string> data; data << "Jedan"; data << "Dva"; data << "Tri"; Do sada sam mislio da je overload operatora << vezan samo za ostream i da posebne STL konstrukcije omogucavaju koriscenje operatora << na gore navedeni nacin i prijatno sam se iznenadio kada sam video da operator << moze da se koristi i za druge stvari. Uprosticu primer za operator << da bi se lakse razumelo pitanje: Code: std::list<int>& operator << (std::list<int>& list, const int& elem) { list.push_back(elem); return list; } Glavno pitanje se odnosi na overload operatora << ( koji sam pre sretao samo u kombinaciji sa ostream i istream ( >> ) objektima ). Zanima me kako sada aplikacija zna da pozove ovaj operator za list objekat kada pozovem u kodu, npr data << 3;? Da li je to priroda operatora << i da li unapred definisano da potpis funkcije mora biti strogo definisan na ovaj nacin da bi kompajler odredio koji je levi a koji desni operand operator <<? Mozda je prosto objasnjenje ali trenutno ne mogu da shvatim kako ovo funkcionise (mozda mi je negde promaklo). |